LyoKICogQklPUyBpbnRlcnJ1cHQgMTBoIGhhbmRsZXIKICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqIENvcHlyaWdodCAxOTk4IEpvc2VwaCBQcmFuZXZpY2gKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2luY2x1ZGUgIm1pc2NlbXUuaCIKI2luY2x1ZGUgInZnYS5oIgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgojaW5jbHVkZSAiZG9zZXhlLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChpbnQpOwoKLyoKICogRGlzcGxheSBjb21iaW5hdGlvbiBjb2RlIGZvciBhY3RpdmUgZGlzcGxheS4KICoKICogVmFsdWVzIChoZXgpOgogKiAwMCAtIG5vIGRpc3BsYXkKICogMDEgLSBtb25vY2hyb21lIGFkYXB0ZXIgdy8gbW9ub2Nocm9tZSBkaXNwbGF5CiAqIDAyIC0gQ0dBIHcvIGNvbG9yIGRpc3BsYXkKICogMDMgLSByZXNlcnZlZAogKiAwNCAtIEVHQSB3LyBjb2xvciBkaXNwbGF5CiAqIDA1IC0gRUdBIHcvIG1vbm9jaHJvbWUgZGlzcGxheQogKiAwNiAtIFBHQSB3LyBjb2xvciBkaXNwbGF5CiAqIDA3IC0gVkdBIHcvIG1vbm9jaHJvbWUgYW5hbG9nIGRpc3BsYXkKICogMDggLSBWR0Egdy8gY29sb3IgYW5hbG9nIGRpc3BsYXkKICogMDkgLSByZXNlcnZlZAogKiAwQSAtIE1DR0Egdy8gZGlnaXRhbCBjb2xvciBkaXNwbGF5CiAqIDBCIC0gTUNHQSB3LyBtb25vY2hyb21lIGFuYWxvZyBkaXNwbGF5CiAqIDBDIC0gTUNHQSB3LyBjb2xvciBhbmFsb2cgZGlzcGxheQogKiBGRiAtIHVua25vd24gZGlzcGxheSB0eXBlCiAqLwojZGVmaW5lIElOVDEwX0RDQyAweDA4CgojaW5jbHVkZSAicHNocGFjazEuaCIKCi8qCiAqIFN0cnVjdHVyZSBmb3IgRE9TIGRhdGEgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBhcHBsaWNhdGlvbnMuCiAqIFRoaXMgc3RydWN0dXJlIG11c3QgYmUgY29ycmVjdGx5IHBhY2tlZC4KICovCnR5cGVkZWYgc3RydWN0IF9JTlQxMF9IRUFQIHsKICAgIEJZVEUgIFN0YXRpY01vZGVTdXBwb3J0WzddOyAgICAgLyogbW9kZXMgc3VwcG9ydGVkIDEuLjcgKi8KICAgIEJZVEUgIFN0YXRpY1NjYW5saW5lU3VwcG9ydDsgICAgLyogc2NhbiBsaW5lcyBzdXBwb3J0ZWQgKi8KICAgIEJZVEUgIFN0YXRpY051bWJlckNoYXJCbG9ja3M7ICAgLyogdG90YWwgbnVtYmVyIG9mIGNoYXIgYmxvY2tzICovCiAgICBCWVRFICBTdGF0aWNBY3RpdmVDaGFyQmxvY2tzOyAgIC8qIG1heCBudW1iZXIgb2YgYWN0aXZlIGNoYXIgYmxvY2tzICovCiAgICBXT1JEICBTdGF0aWNNaXNjRmxhZ3M7ICAgICAgICAgIC8qIG1pc2MgZnVuY3Rpb24gc3VwcG9ydCBmbGFncyAqLwogICAgV09SRCAgU3RhdGljUmVzZXJ2ZWQxOyAgICAgICAgICAvKiByZXNlcnZlZCAqLwogICAgQllURSAgU3RhdGljU2F2ZVBvaW50ZXJGbGFnczsgICAvKiBzYXZlIHBvaW50ZXIgZnVuY3Rpb24gZmxhZ3MgKi8KICAgIEJZVEUgIFN0YXRpY1Jlc2VydmVkMjsgICAgICAgICAgLyogcmVzZXJ2ZWQgKi8KCiAgICBXT1JEICBWZXNhQ3VycmVudE1vZGU7CiAgICBXT1JEICBWZXNhTW9kZUxpc3RbNjRdOwogICAgY2hhciAgVmVzYU9FTU5hbWVbMzJdOwogICAgY2hhciAgVmVzYVByb2R1Y3ROYW1lWzMyXTsKICAgIGNoYXIgIFZlc2FQcm9kdWN0UmV2WzMyXTsKICAgIGNoYXIgIFZlc2FWZW5kb3JOYW1lWzMyXTsKCiAgICBXT1JEICBXaW5lSGVhcFNlZ21lbnQ7Cn0gSU5UMTBfSEVBUDsKCiNpbmNsdWRlICJwb3BwYWNrLmgiCgovKgogKiBXaW5lIGludGVybmFsIGluZm9ybWF0aW9uIGFib3V0IHZpZGVvIG1vZGVzLgogKiBJZiBkZXB0aCBpcyB6ZXJvLCB0aGUgbW9kZSBpcyBjb25zaWRlcmVkIHRvCiAqIGJlIGEgdGV4dCBtb2RlLgogKi8KdHlwZWRlZiBzdHJ1Y3QgewogICAgV09SRCBNb2RlOwogICAgV09SRCBXaWR0aDsKICAgIFdPUkQgSGVpZ2h0OwogICAgV09SRCBEZXB0aDsKfSBJTlQxMF9NT0RFOwoKCi8qCiAqIExpc3Qgb2Ygc3VwcG9ydGVkIHZpZGVvIG1vZGVzLgogKi8Kc3RhdGljIGNvbnN0IElOVDEwX01PREUgSU5UMTBfbW9kZWxpc3RbXSA9CnsKICAgIHsweDAwMDAsICAgNDAsICAgMjUsICAwfSwKICAgIHsweDAwMDEsICAgNDAsICAgMjUsICAwfSwKICAgIHsweDAwMDIsICAgODAsICAgMjUsICAwfSwKICAgIHsweDAwMDMsICAgODAsICAgMjUsICAwfSwKICAgIHsweDAwMDcsICAgODAsICAgMjUsICAwfSwKICAgIHsweDAwMGQsICAzMjAsICAyMDAsICA0fSwKICAgIHsweDAwMGUsICA2NDAsICAyMDAsICA0fSwKICAgIHsweDAwMTAsICA2NDAsICAzNTAsICA0fSwKICAgIHsweDAwMTIsICA2NDAsICA0ODAsICA0fSwKICAgIHsweDAwMTMsICAzMjAsICAyMDAsICA4fSwKICAgIHsweDAxMDAsICA2NDAsICA0MDAsICA4fSwKICAgIHsweDAxMDEsICA2NDAsICA0ODAsICA4fSwKICAgIHsweDAxMDIsICA4MDAsICA2MDAsICA0fSwKICAgIHsweDAxMDMsICA4MDAsICA2MDAsICA4fSwKICAgIHsweDAxMDQsIDEwMjQsICA3NjgsICA0fSwKICAgIHsweDAxMDUsIDEwMjQsICA3NjgsICA4fSwKICAgIHsweDAxMDYsIDEyODAsIDEwMjQsICA0fSwKICAgIHsweDAxMDcsIDEyODAsIDEwMjQsICA4fSwKICAgIHsweDAxMDgsICAgODAsICAgNjAsICAwfSwKICAgIHsweDAxMDksICAxMzIsICAgMjUsICAwfSwKICAgIHsweDAxMGEsICAxMzIsICAgNDMsICAwfSwKICAgIHsweDAxMGIsICAxMzIsICAgNTAsICAwfSwKICAgIHsweDAxMGMsICAxMzIsICAgNjAsICAwfSwKICAgIHsweDAxMGQsICAzMjAsICAyMDAsIDE1fSwKICAgIHsweDAxMGUsICAzMjAsICAyMDAsIDE2fSwKICAgIHsweDAxMGYsICAzMjAsICAyMDAsIDI0fSwKICAgIHsweDAxMTAsICA2NDAsICA0ODAsIDE1fSwKICAgIHsweDAxMTEsICA2NDAsICA0ODAsIDE2fSwKICAgIHsweDAxMTIsICA2NDAsICA0ODAsIDI0fSwKICAgIHsweDAxMTMsICA4MDAsICA2MDAsIDE1fSwKICAgIHsweDAxMTQsICA4MDAsICA2MDAsIDE2fSwKICAgIHsweDAxMTUsICA4MDAsICA2MDAsIDI0fSwKICAgIHsweDAxMTYsIDEwMjQsICA3NjgsIDE1fSwKICAgIHsweDAxMTcsIDEwMjQsICA3NjgsIDE2fSwKICAgIHsweDAxMTgsIDEwMjQsICA3NjgsIDI0fSwKICAgIHsweDAxMTksIDEyODAsIDEwMjQsIDE1fSwKICAgIHsweDAxMWEsIDEyODAsIDEwMjQsIDE2fSwKICAgIHsweDAxMWIsIDEyODAsIDEwMjQsIDI0fSwKICAgIHsweGZmZmYsICAgIDAsICAgIDAsICAwfQp9OwoKLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMuICovCnN0YXRpYyBJTlQxMF9IRUFQICpJTlQxMF9HZXRIZWFwKHZvaWQpOwpzdGF0aWMgdm9pZCBJTlQxMF9TZXRDdXJzb3JQb3MoQklPU0RBVEEqLCB1bnNpZ25lZCwgdW5zaWduZWQsIHVuc2lnbmVkKTsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIElOVDEwX0ZpbmRNb2RlCiAqLwpzdGF0aWMgY29uc3QgSU5UMTBfTU9ERSAqSU5UMTBfRmluZE1vZGUoIFdPUkQgbW9kZSApCnsKICAgIGNvbnN0IElOVDEwX01PREUgKnB0ciA9IElOVDEwX21vZGVsaXN0OwogICAgCiAgICAvKgogICAgICogRmlsdGVyIG91dCBmbGFncy4KICAgICAqLwogICAgbW9kZSAmPSAweDE3ZjsKCiAgICB3aGlsZSAocHRyLT5Nb2RlICE9IDB4ZmZmZikKICAgIHsKICAgICAgICBpZiAocHRyLT5Nb2RlID09IG1vZGUpCiAgICAgICAgICAgIHJldHVybiBwdHI7CiAgICAgICAgcHRyKys7CiAgICB9CgogICAgcmV0dXJuIE5VTEw7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIElOVDEwX0ZpbGxDb250cm9sbGVySW5mb3JtYXRpb24KICoKICogRmlsbCAyNTYtYnl0ZSAoVkJFMS54KSBvciA1MTItYnl0ZSBidWZmZXIgKFZCRTIuMCspIHdpdGgKICogY2FwYWJpbGl0aWVzIG9mIHRoZSB2aWRlbyBjb250cm9sbGVyLgogKi8Kc3RhdGljIHZvaWQgSU5UMTBfRmlsbENvbnRyb2xsZXJJbmZvcm1hdGlvbiggQllURSAqYnVmZmVyICkKewogICAgSU5UMTBfSEVBUCAqaGVhcCA9IElOVDEwX0dldEhlYXAoKTsKCiAgICAvKiAwMCAtIEJZVEVbNF06IHNpZ25hdHVyZSAqLwogICAgbWVtbW92ZSggYnVmZmVyLCAiVkVTQSIsIDQgKTsKCiAgICAvKiAwNCAtIFdPUkQ6IHZlcnNpb24gbnVtYmVyICovCiAgICAqKFdPUkQqKShidWZmZXIgKyA0KSA9IDB4MDMwMDsgLyogdmVyc2lvbiAzLjAgKi8KICAgIAogICAgLyogMDYgLSBEV09SRDogcG9pbnRlciB0byBPRU0gbmFtZSAqLwogICAgKihTRUdQVFIqKShidWZmZXIgKyA2KSA9IE1BS0VTRUdQVFIoIGhlYXAtPldpbmVIZWFwU2VnbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihJTlQxMF9IRUFQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlc2FPRU1OYW1lKSApOwoKICAgIC8qCiAgICAgKiAxMCAtIERXT1JEOiBjYXBhYmlsaXRpZXMgZmxhZ3MgCiAgICAgKiBCaXRzOgogICAgICogICAgMCAtIERBQyBjYW4gYmUgc3dpdGNoZWQgaW50byA4LWJpdCBtb2RlCiAgICAgKiAgICAxIC0gbm9uLVZHQSBjb250cm9sbGVyCiAgICAgKiAgICAyIC0gcHJvZ3JhbW1lZCBEQUMgd2l0aCBibGFuayBiaXQKICAgICAqICAgIDMgLSBjb250cm9sbGVyIHN1cHBvcnRzIGhhcmR3YXJlIHN0ZXJlb3Njb3BpYyBzaWduYWxsaW5nCiAgICAgKiAgICA0IC0gPTAgc3RlcmVvIHNpZ25hbGxpbmcgdmlhIGV4dGVybmFsIFZFU0Egc3RlcmVvIGNvbm5lY3RvcgogICAgICogICAgICAgID0xIHN0ZXJlbyBzaWduYWxsaW5nIHZpYSBWRVNBIEVWQyBjb25uZWN0b3IKICAgICAqICAgIDUgLSBjb250cm9sbGVyIHN1cHBvcnRzIGhhcmR3YXJlIG1vdXNlIGN1cnNvcgogICAgICogICAgNiAtIGNvbnRyb2xsZXIgc3VwcG9ydHMgaGFyZHdhcmUgY2xpcHBpbmcKICAgICAqICAgIDcgLSBjb250cm9sbGVyIHN1cHBvcnRzIHRyYW5zcGFyZW50IEJpdEJMVAogICAgICogOC0zMSAtIHJlc2VydmVkICgwKQogICAgICovCiAgICAqKERXT1JEKikoYnVmZmVyICsgMTApID0gMDsgLyogRklYTUUgKi8KICAgIAogICAgLyogMTQgLSBEV09SRDogcG9pbnRlciB0byBsaXN0IG9mIHN1cHBvcnRlZCBWRVNBIGFuZCBPRU0gdmlkZW8gbW9kZXMgKi8KICAgICooU0VHUFRSKikoYnVmZmVyICsgMTQpID0gTUFLRVNFR1BUUiggaGVhcC0+V2luZUhlYXBTZWdtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihJTlQxMF9IRUFQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXNhTW9kZUxpc3QpICk7CgogICAgLyogMTggLSBXT1JEOiB0b3RhbCBhbW91bnQgb2YgdmlkZW8gbWVtb3J5IGluIDY0SyBibG9ja3MgKi8KICAgICooV09SRCopKGJ1ZmZlciArIDE4KSA9IDE2OyAvKiBGSVhNRSAqLwoKICAgIC8qIDIwIC0gV09SRDogT0VNIHNvZnR3YXJlIHZlcnNpb24gKEJDRCwgaGlnaCBieXRlID0gbWFqb3IpICovCiAgICAqKFdPUkQqKShidWZmZXIgKyAyMCkgPSAweDAxMDA7IC8qIHZlcnNpb24gMS4wICovCgogICAgLyogMjIgLSBEV09SRDogcG9pbnRlciB0byB2ZW5kb3IgbmFtZSAqLwogICAgKihTRUdQVFIqKShidWZmZXIgKyAyMikgPSBNQUtFU0VHUFRSKCBoZWFwLT5XaW5lSGVhcFNlZ21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKElOVDEwX0hFQVAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlc2FWZW5kb3JOYW1lKSApOwoKICAgIC8qIDI2IC0gRFdPUkQ6IHBvaW50ZXIgdG8gcHJvZHVjdCBuYW1lICovCiAgICAqKFNFR1BUUiopKGJ1ZmZlciArIDI2KSA9IE1BS0VTRUdQVFIoIGhlYXAtPldpbmVIZWFwU2VnbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoSU5UMTBfSEVBUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVzYVByb2R1Y3ROYW1lKSApOwoKICAgIC8qIDMwIC0gRFdPUkQ6IHBvaW50ZXIgdG8gcHJvZHVjdCByZXZpc2lvbiBzdHJpbmcgKi8KICAgICooU0VHUFRSKikoYnVmZmVyICsgMzApID0gTUFLRVNFR1BUUiggaGVhcC0+V2luZUhlYXBTZWdtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihJTlQxMF9IRUFQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXNhUHJvZHVjdFJldikgKTsKCiAgICAvKiAzNCAtIFdPUkQ6IFZCRS9BRiB2ZXJzaW9uIChpZiBjYXBhYmlsaXRpZXMgYml0IDMgc2V0KSAqLwogICAgKihXT1JEKikoYnVmZmVyICsgMzQpID0gMDsKCiAgICAvKgogICAgICogMzYgLSBEV09SRDogcG9pbnRlciB0byBsaXN0IG9mIGFjY2VsZXJhdGVkIG1vZGVzIAogICAgICogICAgICAgICAgICAgKGlmIGNhcGFiaWxpdGllcyBiaXQgMyBzZXQpIAogICAgICovCiAgICAqKFNFR1BUUiopKGJ1ZmZlciArIDM2KSA9IDA7CgogICAgLyogNDAgLSBCWVRFWzIxNl06IHJlc2VydmVkIGZvciBWQkUgaW1wbGVtZW50YXRpb24sIHNldCB0byB6ZXJvICovCiAgICBtZW1zZXQoIGJ1ZmZlciArIDQwLCAyMTYsIDAgKTsKCiAgICAvKiAKICAgICAqIDI1NiAtIEJZVEVbMjU2XTogcmVzZXJ2ZWQgZm9yIFZCRTMuMCBpbXBsZW1lbnRhdGlvbiwgCiAgICAgKiAgICAgICAgICAgICAgICAgIGlnbm9yZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCBvbGRlciBwcm9ncmFtcwogICAgICovCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIElOVDEwX0ZpbGxNb2RlSW5mb3JtYXRpb24KICoKICogRmlsbCAyNTYtYnl0ZSBidWZmZXIgd2l0aCBleHRlbmRlZCBpbmZvcm1hdGlvbiBhYm91dCBkaXNwbGF5IG1vZGUuCiAqCiAqIFJldHVybnMgRkFMU0UgaWYgbW9kZSBpcyB1bmtub3duIGFuZCBUUlVFIGlzIG1vZGUgaXMga25vd24KICogZXZlbiBpZiBpdCBpcyBub3Qgc3VwcG9ydGVkLgogKi8Kc3RhdGljIEJPT0wgSU5UMTBfRmlsbE1vZGVJbmZvcm1hdGlvbiggQllURSAqYnVmZmVyLCBXT1JEIG1vZGUgKQp7CiAgICBjb25zdCBJTlQxMF9NT0RFICpwdHIgPSBJTlQxMF9GaW5kTW9kZSggbW9kZSApOwogICAgaWYgKCFwdHIpCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIC8qCiAgICAgKiAwMCAtIFdPUkQ6IG1vZGUgYXR0cmlidXRlcwogICAgICogQml0czoKICAgICAqICAgICAwIC0gTW9kZSBzdXBwb3J0ZWQgYnkgcHJlc2VudCBoYXJkd2FyZSBjb25maWd1cmF0aW9uLgogICAgICogICAgIDEgLSBPcHRpb25hbCBpbmZvcm1hdGlvbiBhdmFpbGFibGUuIE11c3QgYmUgPTEgZm9yIFZCRSB2MS4yKy4KICAgICAqICAgICAyIC0gQklPUyBvdXRwdXQgc3VwcG9ydGVkLgogICAgICogICAgICAgICBJbnQxMCBmdW5jdGlvbnMgMDEsIDAyLCAwNiwgMDcsIDA5LCAwYSBhbmQgMGUgYXJlIHN1cHBvcnRlZC4KICAgICAqICAgICAzIC0gU2V0IGlmIGNvbG9yLCBjbGVhciBpZiBtb25vY2hyb21lLgogICAgICogICAgIDQgLSBTZXQgaWYgZ3JhcGhpY3MgbW9kZSwgY2xlYXIgaWYgdGV4dCBtb2RlLgogICAgICogICAgIDUgLSBNb2RlIGlzIG5vdCBWR0EtY29tcGF0aWJsZSBpZiBzZXQuCiAgICAgKiAgICAgICAgIFZHQS1jb21wYXRpYmxlIG1vZGVzIHN1cHBvcnQgc3RhbmRhcmQgVkdBIEkvTyBwb3J0cy4KICAgICAqICAgICA2IC0gQmFuay1zd2l0Y2hlZCAob3Igd2luZG93ZWQpIG1vZGUgaXMgbm90IHN1cHBvcnRlZCBpZiBzZXQuCiAgICAgKiAgICAgNyAtIExpbmVhciBmcmFtZWJ1ZmZlciBtb2RlIHN1cHBvcnRlZC4KICAgICAqICAgICA4IC0gRG91YmxlIHNjYW5uaW5nIHN1cHBvcnRlZC4KICAgICAqICAgICA5IC0gSW50ZXJsYWNlZCBvcGVyYXRpb24gc3VwcG9ydGVkLgogICAgICogICAgMTAgLSBUcmlwbGUgYnVmZmVyaW5nIHN1cHBvcnRlZC4KICAgICAqICAgIDExIC0gU3RlcmVvc2NvcGljIGRpc3BsYXkgc3VwcG9ydGVkLgogICAgICogICAgMTIgLSBEdWFsIGRpc3BsYXkgc3RhcnQgYWRkcmVzcyBzdXBwb3J0ZWQuCiAgICAgKiAxMy0xNSAtIFJlc2VydmVkLgogICAgICovCiAgICB7CiAgICAgICAgV09SRCBhdHRyID0gMHgwMDBhOyAvKiBjb2xvciBtb2RlLCBvcHRpb25hbCBpbmZvICovCgogICAgICAgIC8qCiAgICAgICAgICogRklYTUU6IEF0dHJpYnV0ZSBoYW5kbGluZyBpcyBpbmNvbXBsZXRlLgogICAgICAgICAqLwoKICAgICAgICAvKiBNb2RlIHN1cHBvcnRlZD8gRklYTUU6IGNvcnJlY3QgdmFsdWUgKi8KICAgICAgICBhdHRyIHw9IDB4MDAwMTsKCiAgICAgICAgLyogR3JhcGhpY2FsIG1vZGU/ICovCiAgICAgICAgaWYgKHB0ci0+RGVwdGgpIAogICAgICAgICAgICBhdHRyIHw9IDB4MDAxMDsKCiAgICAgICAgLyogTm90IFZHQS1jb21wYXRpYmxlPyAqLwogICAgICAgIGlmIChtb2RlID4gMHhmZikKICAgICAgICAgICAgYXR0ciB8PSAweDAwMjA7CgogICAgICAgICooV09SRCopKGJ1ZmZlciArIDApID0gYXR0cjsKICAgIH0KCiAgICAvKgogICAgICogMDIgLSBCWVRFWzJdOiB3aW5kb3cgYXR0cmlidXRlcywgd2luZG93IEEgYW5kIHdpbmRvdyBCCiAgICAgKiBCaXRzOgogICAgICogICAwIC0gV2luZG93IGV4aXN0cy4KICAgICAqICAgMSAtIFdpbmRvdyBpcyByZWFkYWJsZS4KICAgICAqICAgMiAtIFdpbmRvdyBpcyB3cml0YWJsZS4KICAgICAqIDMtNyAtIFJlc2VydmVkLgogICAgICovCiAgICBidWZmZXJbMl0gPSAweDA3OyAvKiB3aW5kb3cgQSBleGlzdHMsIHJlYWRhYmxlIGFuZCB3cml0YWJsZSAqLwogICAgYnVmZmVyWzNdID0gMHgwMDsgLyogd2luZG93IEIgbm90IHN1cHBvcnRlZCAqLwoKICAgIC8qIDA0IC0gV09SRDogd2luZG93IGdyYW51bGFyaXR5IGluIEtCICovCiAgICAqKFdPUkQqKShidWZmZXIgKyA0KSA9IDY0OwoKICAgIC8qIDA2IC0gV09SRDogd2luZG93IHNpemUgaW4gS0IgKi8KICAgICooV09SRCopKGJ1ZmZlciArIDYpID0gNjQ7CgogICAgLyogMDggLSBXT1JEWzJdOiBzdGFydCBzZWdtZW50cywgd2luZG93IEEgYW5kIHdpbmRvdyBCICovCiAgICAqKFdPUkQqKShidWZmZXIgKyAgOCkgPSAweGEwMDA7IC8qIHdpbmRvdyBBIHNlZ21lbnQgKi8KICAgICooV09SRCopKGJ1ZmZlciArIDEwKSA9IDB4MDAwMDsgLyogd2luZG93IEIgbm90IHN1cHBvcnRlZCAqLwoKICAgIC8qIDEyIC0gRFdPUkQ6IHdpbmRvdyBwb3NpdGlvbmluZyBmdW5jdGlvbiAqLwogICAgKihEV09SRCopKGJ1ZmZlciArIDEyKSA9IDA7IC8qIG5vdCBzdXBwb3J0ZWQgKi8KICAgIAogICAgLyogMTYgLSBXT1JEOiBieXRlcyBwZXIgc2NhbiBsaW5lICovCiAgICAqKFdPUkQqKShidWZmZXIgKyAxNikgPSAwOyAvKiBGSVhNRSAqLwoKICAgIC8qIDE4IC0gV09SRDogd2lkdGggaW4gcGl4ZWxzIChncmFwaGljcykgb3IgY2hhcmFjdGVycyAodGV4dCkgKi8KICAgICooV09SRCopKGJ1ZmZlciArIDE4KSA9IHB0ci0+V2lkdGg7CgogICAgLyogMjAgLSBXT1JEOiBoZWlnaHQgaW4gcGl4ZWxzIChncmFwaGljcykgb3IgY2hhcmFjdGVycyAodGV4dCkgKi8KICAgICooV09SRCopKGJ1ZmZlciArIDIwKSA9IHB0ci0+SGVpZ2h0OwoKICAgIC8qIDIyIC0gQllURTogd2lkdGggb2YgY2hhcmFjdGVyIGNlbGwgaW4gcGl4ZWxzICovCiAgICBidWZmZXJbMjJdID0gMDsgLyogRklYTUUgKi8KCiAgICAvKiAyMyAtIEJZVEU6IGhlaWdodCBvZiBjaGFyYWN0ZXIgY2VsbCBpbiBwaXhlbHMgKi8KICAgIGJ1ZmZlclsyM10gPSAwOyAvKiBGSVhNRSAqLwoKICAgIC8qIDI0IC0gQllURTogbnVtYmVyIG9mIG1lbW9yeSBwbGFuZXMgKi8KICAgIGJ1ZmZlclsyNF0gPSAxOyAvKiBGSVhNRSAqLwoKICAgIC8qIDI1IC0gQllURTogbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsICovCiAgICBidWZmZXJbMjVdID0gcHRyLT5EZXB0aDsgLyogRklYTUU6IHRleHQgbW9kZXM/IHJlc2VydmVkIGJpdHM/ICovCgogICAgLyogMjYgLSBCWVRFOiBudW1iZXIgb2YgYmFua3MgKi8KICAgIGJ1ZmZlclsyNl0gPSAxOyAvKiBGSVhNRSAqLwoKICAgIC8qCiAgICAgKiAyNyAtIEJZVEU6IG1lbW9yeSBtb2RlbCB0eXBlCiAgICAgKiBWYWx1ZXMgKGhleCk6CiAgICAgKiAgICAwMCAtIFRleHQgbW9kZQogICAgICogICAgMDEgLSBDR0EgZ3JhcGhpY3MKICAgICAqICAgIDAyIC0gSGVyY3VsZXMgZ3JhcGhpY3MKICAgICAqICAgIDAzIC0gUGxhbmFyCiAgICAgKiAgICAwNCAtIFBhY2tlZCBwaXhlbAogICAgICogICAgMDUgLSBOb24tY2hhaW4gNCwgMjU2IGNvbG9yCiAgICAgKiAgICAwNiAtIERpcmVjdCBjb2xvcgogICAgICogICAgMDcgLSBZVVYKICAgICAqIDA4LTBGIC0gUmVzZXJ2ZWQgZm9yIFZFU0EuCiAgICAgKiAxMC1GRiAtIE9FTSBtZW1vcnkgbW9kZWxzLgogICAgICovCiAgICBpZiAoIXB0ci0+RGVwdGgpCiAgICAgICAgYnVmZmVyWzI3XSA9IDA7IC8qIHRleHQgbW9kZSAqLwogICAgZWxzZQogICAgICAgIGJ1ZmZlclsyN10gPSAzOyAvKiBGSVhNRSAqLwoKICAgIC8qIDI4IC0gQllURTogc2l6ZSBvZiBiYW5rIGluIEtCICovCiAgICBidWZmZXJbMjhdID0gMDsgLyogRklYTUUgKi8KCiAgICAvKiAyOSAtIEJZVEU6IG51bWJlciBvZiBpbWFnZSBwYWdlcyAobGVzcyBvbmUpIGluIHZpZGVvIFJBTSAqLwogICAgYnVmZmVyWzI5XSA9IDA7IC8qIEZJWE1FICovCgogICAgLyogMzAgLSBCWVRFOiByZXNlcnZlZCAoMHgwMCBmb3IgVkJFIDEuMC0yLjAsIDB4MDEgZm9yIFZCRSAzLjApICovCiAgICBidWZmZXJbMzBdID0gMHgwMTsKCiAgICAvKiAKICAgICAqIDMxIC0gQllURTogcmVkIG1hc2sgc2l6ZSAKICAgICAqIFNpemUgb2YgcmVkIGNvbG9yIGNvbXBvbmVudCBpbiBiaXRzLgogICAgICogVXNlZCBvbmx5IHdoZW4gbWVtb3J5IG1vZGVsIGlzIGRpcmVjdCBjb2xvciwgb3RoZXJ3aXNlIHNldCB0byB6ZXJvLgogICAgICovCiAgICBidWZmZXJbMzFdID0gMDsgLyogRklYTUUgKi8KCiAgICAvKgogICAgICogMzIgLSBCWVRFOiByZWQgZmllbGQgcG9zaXRpb24gCiAgICAgKiBCaXQgcG9zaXRpb24gb2YgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBvZiByZWQgY29sb3IgY29tcG9uZW50LgogICAgICogVXNlZCBvbmx5IHdoZW4gbWVtb3J5IG1vZGVsIGlzIGRpcmVjdCBjb2xvciwgb3RoZXJ3aXNlIHNldCB0byB6ZXJvLgogICAgICovCiAgICBidWZmZXJbMzJdID0gMDsgLyogRklYTUUgKi8KCiAgICAvKiAzMyAtIEJZVEU6IGdyZWVuIG1hc2sgc2l6ZSAqLwogICAgYnVmZmVyWzMzXSA9IDA7IC8qIEZJWE1FICovCgogICAgLyogMzQgLSBCWVRFOiBncmVlbiBmaWVsZCBwb3NpdGlvbiAqLwogICAgYnVmZmVyWzM0XSA9IDA7IC8qIEZJWE1FICovCgogICAgLyogMzUgLSBCWVRFOiBibHVlIG1hc2sgc2l6ZSAqLwogICAgYnVmZmVyWzM1XSA9IDA7IC8qIEZJWE1FICovCiAgICAKICAgIC8qIDM2IC0gQllURTogYmx1ZSBmaWVsZCBwb3NpdGlvbiAqLwogICAgYnVmZmVyWzM2XSA9IDA7CgogICAgLyogMzcgLSBCWVRFOiByZXNlcnZlZCBtYXNrIHNpemUgKi8KICAgIGJ1ZmZlclszN10gPSAwOwoKICAgIC8qIDM4IC0gQllURTogcmVzZXJ2ZWQgbWFzayBwb3NpdGlvbiAqLwogICAgYnVmZmVyWzM4XSA9IDA7CgogICAgLyoKICAgICAqIDM5IC0gQllURTogZGlyZWN0IGNvbG9yIG1vZGUgaW5mbyAKICAgICAqIEJpdHM6CiAgICAgKiAwIC0gU2V0IGlmIGNvbG9yIHJhbXAgaXMgcHJvZ3JhbW1hYmxlLgogICAgICogMSAtIFNldCBpZiBieXRlcyBpbiByZXNlcnZlZCBmaWVsZCBtYXkgYmUgdXNlZCBieSBhcHBsaWNhdGlvbi4KICAgICAqLwogICAgYnVmZmVyWzM5XSA9IDA7IC8qIG5vdCBzdXBwb3J0ZWQgKi8KCiAgICAvKiA0MCAtIERXT1JEOiBwaHlzaWNhbCBhZGRyZXNzIG9mIGxpbmVhciB2aWRlbyBidWZmZXIgKi8KICAgICooRFdPUkQqKShidWZmZXIgKyA0MCkgPSAwOyAvKiBub3Qgc3VwcG9ydGVkICovCgogICAgLyogNDQgLSBEV09SRDogcmVzZXJ2ZWQsIGFsd2F5cyB6ZXJvICovCiAgICAqKERXT1JEKikoYnVmZmVyICsgNDQpID0gMDsKCiAgICAvKiA0OCAtIFdPUkQ6IHJlc2VydmVkLCBhbHdheXMgemVybyAqLwogICAgKihXT1JEKikoYnVmZmVyICsgNDgpID0gMDsKCiAgICAvKiA1MCAtIFdPUkQ6IGJ5dGVzIHBlciBzY2FuIGxpbmUgaW4gbGluZWFyIG1vZGVzICovCiAgICAqKFdPUkQqKShidWZmZXIgKyA1MCkgPSAqKFdPUkQqKShidWZmZXIgKyAxNik7CgogICAgLyogNTIgLSBCWVRFOiBudW1iZXIgb2YgaW1hZ2VzIChsZXNzIG9uZSkgZm9yIGJhbmtlZCB2aWRlbyBtb2RlcyAqLwogICAgYnVmZmVyWzUyXSA9IDA7IC8qIEZJWE1FICovCgogICAgLyogNTMgLSBCWVRFOiBudW1iZXIgb2YgaW1hZ2VzIChsZXNzIG9uZSkgZm9yIGxpbmVhciB2aWRlbyBtb2RlcyAqLwogICAgYnVmZmVyWzUzXSA9IGJ1ZmZlcls1Ml07CgogICAgLyogNTQgLSBCWVRFOiByZWQgbWFzayBzaXplIChsaW5lYXIgbW9kZXMpICovCiAgICBidWZmZXJbNTRdID0gYnVmZmVyWzMxXTsKCiAgICAvKiA1NSAtIEJZVEU6IHJlZCBmaWVsZCBwb3NpdGlvbiAobGluZWFyIG1vZGVzKSAqLwogICAgYnVmZmVyWzU1XSA9IGJ1ZmZlclszMl07CgogICAgLyogNTYgLSBCWVRFOiBncmVlbiBtYXNrIHNpemUgKGxpbmVhciBtb2RlcykgKi8KICAgIGJ1ZmZlcls1Nl0gPSBidWZmZXJbMzNdOwoKICAgIC8qIDU3IC0gQllURTogZ3JlZW4gZmllbGQgc2l6ZSAobGluZWFyIG1vZGVzKSAqLwogICAgYnVmZmVyWzU3XSA9IGJ1ZmZlclszNF07CgogICAgLyogNTggLSBCWVRFOiBibHVlIG1hc2sgc2l6ZSAobGluZWFyIG1vZGVzKSAqLwogICAgYnVmZmVyWzU4XSA9IGJ1ZmZlclszNV07CgogICAgLyogNTkgLSBCWVRFOiBibHVlIGZpZWxkIHBvc2l0aW9uIChsaW5lYXIgbW9kZXMpICovCiAgICBidWZmZXJbNTldID0gYnVmZmVyWzM2XTsKCiAgICAvKiA2MCAtIEJZVEU6IHJlc2VydmVkIG1hc2sgc2l6ZSAobGluZWFyIG1vZGVzKSAqLwogICAgYnVmZmVyWzYwXSA9IGJ1ZmZlclszN107CgogICAgLyogNjEgLSBCWVRFOiByZXNlcnZlZCBtYXNrIHBvc2l0aW9uIChsaW5lYXIgbW9kZXMpICovCiAgICBidWZmZXJbNjFdID0gYnVmZmVyWzM4XTsKCiAgICAvKiA2MiAtIERXT1JEOiBtYXhpbXVtIHBpeGVsIGNsb2NrIGZvciBncmFwaGljcyB2aWRlbyBtb2RlLCBpbiBIeiAqLwogICAgKihEV09SRCopKGJ1ZmZlciArIDYyKSA9IDA7IC8qIEZJWE1FICovCgogICAgLyogNjYgLSBCWVRFWzE5MF06IHJlc2VydmVkLCBzZXQgdG8gemVybyAqLwogICAgbWVtc2V0KCBidWZmZXIgKyA2NiwgMTkwLCAwICk7CgogICAgcmV0dXJuIFRSVUU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIElOVDEwX0ZpbGxTdGF0ZUluZm9ybWF0aW9uCiAqCiAqIEZpbGwgNjQtYnl0ZSBidWZmZXIgd2l0aCBWR0Egc3RhdGUgYW5kIGZ1bmN0aW9uYWxpdHkgaW5mb3JtYXRpb24uCiAqLwpzdGF0aWMgdm9pZCBJTlQxMF9GaWxsU3RhdGVJbmZvcm1hdGlvbiggQllURSAqYnVmZmVyLCBCSU9TREFUQSAqZGF0YSApCnsKICAgIElOVDEwX0hFQVAgKmhlYXAgPSBJTlQxMF9HZXRIZWFwKCk7CgogICAgLyogMDAgLSBEV09SRDogYWRkcmVzcyBvZiBzdGF0aWMgZnVuY3Rpb25hbGl0eSB0YWJsZSAqLwogICAgKihTRUdQVFIqKShidWZmZXIgKyAwKSA9IE1BS0VTRUdQVFIoIGhlYXAtPldpbmVIZWFwU2VnbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihJTlQxMF9IRUFQLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0aWNNb2RlU3VwcG9ydCkgKTsKCiAgICAvKiAwNCAtIEJZVEVbMzBdOiBjb3B5IG9mIEJJT1MgZGF0YSBzdGFydGluZyBmcm9tIDB4NDkgKFZpZGVvTW9kZSkgKi8KICAgIG1lbW1vdmUoIGJ1ZmZlciArIDQsICZkYXRhLT5WaWRlb01vZGUsIDMwICk7CgogICAgLyogMzQgLSBCWVRFOiBudW1iZXIgb2Ygcm93cyAtIDEgKi8KICAgIGJ1ZmZlclszNF0gPSBkYXRhLT5Sb3dzT25TY3JlZW5NaW51czE7CgogICAgLyogMzUgLSBXT1JEOiBieXRlcy9jaGFyYWN0ZXIgKi8KICAgICooV09SRCopKGJ1ZmZlciArIDM1KSA9IGRhdGEtPkJ5dGVzUGVyQ2hhcjsKCiAgICAvKiAzNyAtIEJZVEU6IGRpc3BsYXkgY29tYmluYXRpb24gY29kZSBvZiBhY3RpdmUgZGlzcGxheSAqLwogICAgYnVmZmVyWzM3XSA9IElOVDEwX0RDQzsKCiAgICAvKiAzOCAtIEJZVEU6IERDQyBvZiBhbHRlcm5hdGUgZGlzcGxheSAqLwogICAgYnVmZmVyWzM4XSA9IDA7IC8qIG5vIHNlY29uZGFyeSBkaXNwbGF5ICovCgogICAgLyogMzkgLSBXT1JEOiBudW1iZXIgb2YgY29sb3JzIHN1cHBvcnRlZCBpbiBjdXJyZW50IG1vZGUgKDAwMDBoID0gbW9ubykgKi8KICAgICooV09SRCopKGJ1ZmZlciArIDM5KSA9IDE2OyAvKiBGSVhNRSAqLwoKICAgIC8qIDQxIC0gQllURTogbnVtYmVyIG9mIHBhZ2VzIHN1cHBvcnRlZCBpbiBjdXJyZW50IG1vZGUgKi8KICAgIGJ1ZmZlcls0MV0gPSAxOyAvKiBGSVhNRSAqLwoKICAgIC8qCiAgICAgKiA0MiAtIEJZVEU6IG51bWJlciBvZiBzY2FuIGxpbmVzIGFjdGl2ZQogICAgICogVmFsdWVzIChoZXgpOgogICAgICogMDAgPSAyMDAKICAgICAqIDAxID0gMzUwCiAgICAgKiAwMiA9IDQwMAogICAgICogMDMgPSA0ODAKICAgICAqLwogICAgYnVmZmVyWzQyXSA9IDM7IC8qIEZJWE1FICovCgogICAgLyogNDMgLSBCWVRFOiBwcmltYXJ5IGNoYXJhY3RlciBibG9jayAqLwogICAgYnVmZmVyWzQzXSA9IDA7IC8qIEZJWE1FICovCgogICAgLyogNDQgLSBCWVRFOiBzZWNvbmRhcnkgY2hhcmFjdGVyIGJsb2NrICovCiAgICBidWZmZXJbNDRdID0gMDsgLyogRklYTUUgKi8KCiAgICAvKgogICAgICogNDUgLSBCWVRFOiBtaXNjZWxsYW5lb3VzIGZsYWdzCiAgICAgKiBCaXRzOgogICAgICogMCAtIGFsbCBtb2RlcyBvbiBhbGwgZGlzcGxheXMgb24KICAgICAqIDEgLSBncmF5IHN1bW1pbmcgb24KICAgICAqIDIgLSBtb25vY2hyb21lIGRpc3BsYXkgYXR0YWNoZWQKICAgICAqIDMgLSBkZWZhdWx0IHBhbGV0dGUgbG9hZGluZyBkaXNhYmxlZAogICAgICogNCAtIGN1cnNvciBlbXVsYXRpb24gZW5hYmxlZAogICAgICogNSAtIDAgPSBpbnRlbnNpdHk7IDEgPSBibGlua2luZwogICAgICogNiAtIGZsYXQtcGFuZWwgZGlzcGxheSBpcyBhY3RpdmUKICAgICAqIDcgLSB1bnVzZWQgKDApCiAgICAgKi8KICAgIC8qIEZJWE1FOiBDb3JyZWN0IHZhbHVlPyAqLwogICAgYnVmZmVyWzQ1XSA9CiAgICAgICAgKGRhdGEtPlZHQVNldHRpbmdzICYgMHgwZikgfAogICAgICAgICgoZGF0YS0+TW9kZU9wdGlvbnMgJiAxKSA8PCA0KTsgLyogY3Vyc29yIGVtdWxhdGlvbiAqLwoKICAgIC8qCiAgICAgKiA0NiAtIEJZVEU6IG5vbi1WR0EgbW9kZSBzdXBwb3J0IAogICAgICogQml0czoKICAgICAqICAgMCAtIEJJT1Mgc3VwcG9ydHMgaW5mb3JtYXRpb24gcmV0dXJuIGZvciBhZGFwdGVyIGludGVyZmFjZQogICAgICogICAxIC0gYWRhcHRlciBpbnRlcmZhY2UgZHJpdmVyIHJlcXVpcmVkCiAgICAgKiAgIDIgLSAxNi1iaXQgVkdBIGdyYXBoaWNzIHByZXNlbnQKICAgICAqICAgMyAtID0xIE1GSSBhdHRyaWJ1dGVzIGVuYWJsZWQKICAgICAqICAgICAgID0wIFZHQSBhdHRyaWJ1dGVzIGVuYWJsZWQKICAgICAqICAgNCAtIDEzMi1jb2x1bW4gbW9kZSBzdXBwb3J0ZWQKICAgICAqIDUtNyAtIHJlc2VydmVkCiAgICAgKi8KICAgICBidWZmZXJbNDZdID0gMDsgLyogRklYTUU6IGNvcnJlY3QgdmFsdWU/ICovCgogICAgIC8qIDQ3IC0gQllURVsyXTogcmVzZXJ2ZWQsIHNldCB0byB6ZXJvICovCiAgICAgbWVtc2V0KCBidWZmZXIgKyA0NywgMiwgMCApOwoKICAgICAvKgogICAgICAqIDQ5IC0gQllURTogdmlkZW8gbWVtb3J5IGF2YWlsYWJsZQogICAgICAqIFZhbHVlcyAoaGV4KToKICAgICAgKiAwMCAtIDY0SwogICAgICAqIDAxIC0gMTI4SwogICAgICAqIDAyIC0gMTkySwogICAgICAqIDAzIC0gMjU2SwogICAgICAqLwogICAgIGJ1ZmZlcls0OV0gPSAoZGF0YS0+TW9kZU9wdGlvbnMgJiAweDYwKSA+PiA1OyAvKiBGSVhNRSAqLwoKICAgICAvKgogICAgICAqIDUwIC0gQllURTogc2F2ZSBwb2ludGVyIHN0YXRlIGZsYWdzCiAgICAgICogQml0czoKICAgICAgKiAgIDAgLSA1MTIgY2hhcmFjdGVyIHNldCBhY3RpdmUKICAgICAgKiAgIDEgLSBkeW5hbWljIHNhdmUgYXJlYSBwcmVzZW50CiAgICAgICogICAyIC0gYWxwaGEgZm9udCBvdmVycmlkZSBhY3RpdmUKICAgICAgKiAgIDMgLSBncmFwaGljcyBmb250IG92ZXJyaWRlIGFjdGl2ZQogICAgICAqICAgNCAtIHBhbGV0dGUgb3ZlcnJpZGUgYWN0aXZlCiAgICAgICogICA1IC0gRENDIG92ZXJyaWRlIGFjdGl2ZQogICAgICAqIDYtNyAtIHVudXNlZCAoMCkKICAgICAgKi8KICAgICBidWZmZXJbNTBdID0gaGVhcC0+U3RhdGljU2F2ZVBvaW50ZXJGbGFnczsKCiAgICAgLyoKICAgICAgKiA1MSAtIEJZVEU6IGRpc3BsYXkgaW5mb3JtYXRpb24gYW5kIHN0YXR1cyAKICAgICAgKiBCaXRzOgogICAgICAqICAgMCAtIGZsYXQtcGFuZWwgZGlzcGxheSBhdHRhY2hlZAogICAgICAqICAgMSAtIGZsYXQtcGFuZWwgZGlzcGxheSBhY3RpdmUKICAgICAgKiAgIDIgLSBjb2xvciBkaXNwbGF5CiAgICAgICogMy02IC0gcmVzZXJ2ZWQKICAgICAgKiAgIDcgLSA2NDB4NDgwIGZsYXQtcGFuZWwgY2FuIGJlIHVzZWQgc2ltdWx0YW5lb3VzbHkgd2l0aCBDUlQKICAgICAgKi8KICAgICBidWZmZXJbNTFdID0gNDsgLyogRklYTUU6IGNvcnJlY3QgdmFsdWU/ICovCgogICAgIC8qIDUyIC0gQllURVsxMl06IHJlc2VydmVkLCBzZXQgdG8gemVybyAqLwogICAgIG1lbXNldCggYnVmZmVyICsgNTIsIDEyLCAwICk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIElOVDEwX0dldEhlYXAKICovCklOVDEwX0hFQVAgKklOVDEwX0dldEhlYXAoIHZvaWQgKQp7CiAgICBzdGF0aWMgSU5UMTBfSEVBUCAqaGVhcF9wb2ludGVyID0gMDsKCiAgICBpZiAoIWhlYXBfcG9pbnRlcikKICAgIHsKICAgICAgICBXT1JEIHNlZ21lbnQ7CiAgICAgICAgaW50ICBpOwoKICAgICAgICBoZWFwX3BvaW50ZXIgPSBET1NWTV9BbGxvY0RhdGFVTUIoIHNpemVvZihJTlQxMF9IRUFQKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VnbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKTsKCiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykKICAgICAgICAgICAgaGVhcF9wb2ludGVyLT5TdGF0aWNNb2RlU3VwcG9ydFtpXSA9IDB4ZmY7IC8qIEZJWE1FICovCgogICAgICAgIGhlYXBfcG9pbnRlci0+U3RhdGljU2NhbmxpbmVTdXBwb3J0ID0gNzsgIC8qIEZJWE1FICovCiAgICAgICAgaGVhcF9wb2ludGVyLT5TdGF0aWNOdW1iZXJDaGFyQmxvY2tzID0gMDsgLyogRklYTUUgKi8KICAgICAgICBoZWFwX3BvaW50ZXItPlN0YXRpY0FjdGl2ZUNoYXJCbG9ja3MgPSAwOyAvKiBGSVhNRSAqLwogICAgICAgIGhlYXBfcG9pbnRlci0+U3RhdGljTWlzY0ZsYWdzID0gMHg4ZmY7ICAgIC8qIEZJWE1FICovCiAgICAgICAgaGVhcF9wb2ludGVyLT5TdGF0aWNSZXNlcnZlZDEgPSAwOwogICAgICAgIGhlYXBfcG9pbnRlci0+U3RhdGljU2F2ZVBvaW50ZXJGbGFncyA9IDB4M2Y7IC8qIEZJWE1FICovCiAgICAgICAgaGVhcF9wb2ludGVyLT5TdGF0aWNSZXNlcnZlZDIgPSAwOwoKICAgICAgICBmb3IgKGk9MDsgVFJVRTsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgaGVhcF9wb2ludGVyLT5WZXNhTW9kZUxpc3RbaV0gPSBJTlQxMF9tb2RlbGlzdFtpXS5Nb2RlOwogICAgICAgICAgICBpZiAoSU5UMTBfbW9kZWxpc3RbaV0uTW9kZSA9PSAweGZmZmYpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIHN0cmNweSggaGVhcF9wb2ludGVyLT5WZXNhT0VNTmFtZSwgIldJTkUgU1ZHQSBCT0FSRCIgKTsKICAgICAgICBzdHJjcHkoIGhlYXBfcG9pbnRlci0+VmVzYVZlbmRvck5hbWUsICJXSU5FIiApOwogICAgICAgIHN0cmNweSggaGVhcF9wb2ludGVyLT5WZXNhUHJvZHVjdE5hbWUsICJXSU5FIFNWR0EiICk7CiAgICAgICAgc3RyY3B5KCBoZWFwX3BvaW50ZXItPlZlc2FQcm9kdWN0UmV2LCAiMjAwMyIgKTsKICAgICAgICAKICAgICAgICBoZWFwX3BvaW50ZXItPlZlc2FDdXJyZW50TW9kZSA9IDA7IC8qIEluaXRpYWxpemVkIGxhdGVyLiAqLwogICAgICAgIGhlYXBfcG9pbnRlci0+V2luZUhlYXBTZWdtZW50ID0gc2VnbWVudDsKICAgIH0KCiAgICByZXR1cm4gaGVhcF9wb2ludGVyOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBJTlQxMF9TZXRWaWRlb01vZGUKICoKICogQ2hhbmdlIGN1cnJlbnQgdmlkZW8gbW9kZSB0byBhbnkgVkdBIG9yIFZFU0EgbW9kZS4KICogUmV0dXJucyBUUlVFIGlmIG1vZGUgaXMgc3VwcG9ydGVkLgogKgogKiBNb2RlIGJpdGZpZWxkczoKICogMC02OiAuLiBNb2RlIG51bWJlciAoY29tYmluZWQgd2l0aCBiaXQgOCkuCiAqICAgNzogPTAgQ2xlYXIgc2NyZWVuLgogKiAgICAgID0xIFByZXNlcnZlIGRpc3BsYXkgbWVtb3J5IG9uIG1vZGUgY2hhbmdlIChWR0EgbW9kZXMpLgogKiAgIDg6ID0wIFZHQSBtb2RlLgogKiAgICAgID0xIFZFU0EgbW9kZS4KICogICA5OiAuLiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvLgogKiAgMTA6IC4uIFJlc2VydmVkLCBtdXN0IGJlIHplcm8uCiAqICAxMTogPTAgVXNlIGRlZmF1bHQgcmVmcmVzaCByYXRlLgogKiAgICAgID0xIFVzZSB1c2VyIHNwZWNpZmllZCByZWZyZXNoIHJhdGUuCiAqICAxMjogLi4gUmVzZXJ2ZWQsIG11c3QgYmUgemVyby4KICogIDEzOiAuLiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvLgogKiAgMTQ6ID0wIFVzZSB3aW5kb3dlZCBmcmFtZSBidWZmZXIgbW9kZWwuCiAqICAgICAgPTEgVXNlIGxpbmVhciBmcmFtZSBidWZmZXIgbW9kZWwuCiAqICAxNTogPTAgQ2xlYXIgc2NyZWVuLgogKiAgICAgID0xIFByZXNlcnZlIGRpc3BsYXkgbWVtb3J5IG9uIG1vZGUgY2hhbmdlIChWRVNBIG1vZGVzKS4KICovCnN0YXRpYyBCT09MIElOVDEwX1NldFZpZGVvTW9kZSggQklPU0RBVEEgKmRhdGEsIFdPUkQgbW9kZSApCnsKICAgIGNvbnN0IElOVDEwX01PREUgKnB0ciA9IElOVDEwX0ZpbmRNb2RlKCBtb2RlICk7CiAgICBJTlQxMF9IRUFQICpoZWFwID0gSU5UMTBfR2V0SGVhcCgpOwogICAgQk9PTCBjbGVhclNjcmVlbiA9IFRSVUU7CgogICAgaWYgKCFwdHIpCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIC8qCiAgICAgKiBMaW5lYXIgZnJhbWVidWZmZXIgaXMgbm90IHN1cHBvcnRlZC4KICAgICAqLwogICAgaWYgKG1vZGUgJiAweDQwMDApCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIC8qCiAgICAgKiBDaGVjayBmb3IgVkdBIGFuZCBWRVNBIHByZXNlcnZlIHZpZGVvIG1lbW9yeSBmbGFnLgogICAgICovCiAgICBpZiAoKG1vZGUgJiAweDAwODApIHx8IChtb2RlICYgMHg4MDAwKSkKICAgICAgICBjbGVhclNjcmVlbiA9IEZBTFNFOwoKICAgIC8qCiAgICAgKiBOb3RlIHRoYXQgd2UgZG8gbm90IG1hc2sgb3V0IGZsYWdzIGhlcmUgb24gcHVycG9zZS4KICAgICAqLwogICAgaGVhcC0+VmVzYUN1cnJlbnRNb2RlID0gbW9kZTsKICAgIGlmIChtb2RlIDw9IDB4ZmYpCiAgICAgICAgZGF0YS0+VmlkZW9Nb2RlID0gbW9kZTsKICAgIGVsc2UKICAgICAgICBkYXRhLT5WaWRlb01vZGUgPSAwOwoKICAgIGlmIChwdHItPkRlcHRoID09IDApCiAgICB7CiAgICAgICAgLyogVGV4dCBtb2RlLiAqLwogICAgICAgIFRSQUNFKCAiU2V0dGluZyAlcyAlZHglZCB0ZXh0IG1vZGUgKHNjcmVlbiAlcylcbiIsIAogICAgICAgICAgICAgICBtb2RlIDw9IDB4ZmYgPyAiVkdBIiA6ICJWRVNBIiwgCiAgICAgICAgICAgICAgIHB0ci0+V2lkdGgsIHB0ci0+SGVpZ2h0LCAKICAgICAgICAgICAgICAgY2xlYXJTY3JlZW4gPyAiY2xlYXJlZCIgOiAicHJlc2VydmVkIiApOwoKICAgICAgICAvKgogICAgICAgICAqIEZJWE1FOiBXZSBzaG91bGQgY2hlY2sgaGVyZSBpZiBhbHBoYSBtb2RlIGNvdWxkIGJlIHNldC4KICAgICAgICAgKi8KICAgICAgICBWR0FfU2V0QWxwaGFNb2RlKCBwdHItPldpZHRoLCBwdHItPkhlaWdodCApOwoKICAgICAgICBkYXRhLT5WaWRlb0NvbHVtbnMgPSBwdHItPldpZHRoOwogICAgICAgIGRhdGEtPlJvd3NPblNjcmVlbk1pbnVzMSA9IHB0ci0+SGVpZ2h0IC0gMTsKCiAgICAgICAgaWYgKGNsZWFyU2NyZWVuKQogICAgICAgIHsgICAgICAgICAgICAKICAgICAgICAgICAgVkdBX0NsZWFyVGV4dCggMCwgMCwgcHRyLT5IZWlnaHQtMSwgcHRyLT5XaWR0aC0xLCAweDA3ICk7CiAgICAgICAgICAgIElOVDEwX1NldEN1cnNvclBvcyggZGF0YSwgMCwgMCwgMCApOwogICAgICAgICAgICBWR0FfU2V0Q3Vyc29yUG9zKCAwLCAwICk7ICAgICAgICAgICAgCiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIC8qIEdyYXBoaWNzIG1vZGUuICovCiAgICAgICAgVFJBQ0UoICJTZXR0aW5nICVzICVkeCVkeCVkIGdyYXBoaWNzIG1vZGUgKHNjcmVlbiAlcylcbiIsIAogICAgICAgICAgICAgICBtb2RlIDw9IDB4ZmYgPyAiVkdBIiA6ICJWRVNBIiwgCiAgICAgICAgICAgICAgIHB0ci0+V2lkdGgsIHB0ci0+SGVpZ2h0LCBwdHItPkRlcHRoLAogICAgICAgICAgICAgICBjbGVhclNjcmVlbiA/ICJjbGVhcmVkIiA6ICJwcmVzZXJ2ZWQiICk7CgogICAgICAgIGlmIChWR0FfU2V0TW9kZSggcHRyLT5XaWR0aCwgcHRyLT5IZWlnaHQsIHB0ci0+RGVwdGggKSkKICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIHJldHVybiBUUlVFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBJTlQxMF9HZXRDdXJzb3JQb3MKICovCnN0YXRpYyB2b2lkIElOVDEwX0dldEN1cnNvclBvcyhCSU9TREFUQSpkYXRhLHVuc2lnbmVkIHBhZ2UsdW5zaWduZWQqWCx1bnNpZ25lZCpZKQp7CiAgICAqWCA9IGRhdGEtPlZpZGVvQ3Vyc29yUG9zW3BhZ2UqMl07ICAgLyogY29sdW1uICovCiAgICAqWSA9IGRhdGEtPlZpZGVvQ3Vyc29yUG9zW3BhZ2UqMisxXTsgLyogcm93ICovCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIElOVDEwX1NldEN1cnNvclBvcwogKi8Kc3RhdGljIHZvaWQgSU5UMTBfU2V0Q3Vyc29yUG9zKEJJT1NEQVRBKmRhdGEsdW5zaWduZWQgcGFnZSx1bnNpZ25lZCBYLHVuc2lnbmVkIFkpCnsKICAgIGRhdGEtPlZpZGVvQ3Vyc29yUG9zW3BhZ2UqMl0gPSBYOwogICAgZGF0YS0+VmlkZW9DdXJzb3JQb3NbcGFnZSoyKzFdID0gWTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgSU5UMTBfSW5pdGlhbGl6ZVZpZGVvTW9kZQogKgogKiBUaGUgZmlyc3QgdGltZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBWR0EgZW11bGF0aW9uIGlzIHNldCB0byB0aGUKICogZGVmYXVsdCB0ZXh0IG1vZGUuCiAqLwpzdGF0aWMgdm9pZCBJTlQxMF9Jbml0aWFsaXplVmlkZW9Nb2RlKCBCSU9TREFUQSAqZGF0YSApCnsKICBzdGF0aWMgQk9PTCBhbHJlYWR5X2luaXRpYWxpemVkID0gRkFMU0U7CiAgdW5zaWduZWQgICAgd2lkdGg7CiAgdW5zaWduZWQgICAgaGVpZ2h0OwoKICBpZihhbHJlYWR5X2luaXRpYWxpemVkKQogICAgcmV0dXJuOwogIGFscmVhZHlfaW5pdGlhbGl6ZWQgPSBUUlVFOwoKICBWR0FfSW5pdEFscGhhTW9kZSgmd2lkdGgsICZoZWlnaHQpOwoKICAvKgogICAqIEZJWE1FOiBBZGQgbW9yZSBtYXBwaW5ncyBiZXR3ZWVuIGluaXRpYWwgc2l6ZSBhbmQKICAgKiAgICAgICAgdGV4dCBtb2Rlcy4KICAgKi8KICBpZiAod2lkdGggPj0gODAgJiYgaGVpZ2h0ID49IDI1KQogICAgICBJTlQxMF9TZXRWaWRlb01vZGUoIGRhdGEsIDB4MDMgKTsKICBlbHNlCiAgICAgIElOVDEwX1NldFZpZGVvTW9kZSggZGF0YSwgMHgwMSApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgSU5UMTBfSGFuZGxlVkVTQQogKgogKiBIYW5kbGVyIGZvciBWRVNBIGZ1bmN0aW9ucyAoaW50MTAgZnVuY3Rpb24gMHg0ZikuCiAqLwpzdGF0aWMgdm9pZCBJTlQxMF9IYW5kbGVWRVNBKCBDT05URVhUODYgKmNvbnRleHQgKQp7CiAgICBCSU9TREFUQSAqZGF0YSA9IEJJT1NfREFUQTsKCiAgICBzd2l0Y2goQUxfcmVnKGNvbnRleHQpKSB7CgogICAgY2FzZSAweDAwOiAvKiBSRVRVUk4gQ09OVFJPTExFUiBJTkZPUk1BVElPTiAqLwogICAgICAgIFRSQUNFKCAiVkVTQSBSRVRVUk4gQ09OVFJPTExFUiBJTkZPUk1BVElPTlxuIiApOwogICAgICAgIHsKICAgICAgICAgICAgQllURSAqcHRyID0gQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5TZWdFcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5FZGkpOwogICAgICAgICAgICBJTlQxMF9GaWxsQ29udHJvbGxlckluZm9ybWF0aW9uKCBwdHIgKTsKICAgICAgICAgICAgU0VUX0FMKCBjb250ZXh0LCAweDRmICk7CiAgICAgICAgICAgIFNFVF9BSCggY29udGV4dCwgMHgwMCApOyAvKiAweDAwID0gc3VjY2Vzc2Z1bCAweDAxID0gZmFpbGVkICovCiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwMTogLyogUkVUVVJOIE1PREUgSU5GT1JNQVRJT04gKi8KICAgICAgICBUUkFDRSggIlZFU0EgUkVUVVJOIE1PREUgSU5GT1JNQVRJT04gJTA0eFxuIiwgQ1hfcmVnKGNvbnRleHQpICk7CiAgICAgICAgewogICAgICAgICAgICBCWVRFICpwdHIgPSBDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPlNlZ0VzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPkVkaSk7CiAgICAgICAgICAgIFNFVF9BTCggY29udGV4dCwgMHg0ZiApOwogICAgICAgICAgICBpZiAoSU5UMTBfRmlsbE1vZGVJbmZvcm1hdGlvbiggcHRyLCBDWF9yZWcoY29udGV4dCkgKSkKICAgICAgICAgICAgICAgIFNFVF9BSCggY29udGV4dCwgMHgwMCApOyAvKiBzdGF0dXM6IHN1Y2Nlc3MgKi8KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgU0VUX0FIKCBjb250ZXh0LCAweDAxICk7IC8qIHN0YXR1czogZmFpbGVkICovCiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwMjogLyogU0VUIFN1cGVyVkdBIFZJREVPIE1PREUgKi8KICAgICAgICBUUkFDRSggIlNldCBWRVNBIHZpZGVvIG1vZGUgJTA0eFxuIiwgQlhfcmVnKGNvbnRleHQpICk7CiAgICAgICAgU0VUX0FMKCBjb250ZXh0LCAweDRmICk7IC8qIGZ1bmN0aW9uIHN1cHBvcnRlZCAqLwogICAgICAgIGlmIChJTlQxMF9TZXRWaWRlb01vZGUoIGRhdGEsIEJYX3JlZyhjb250ZXh0KSApKQogICAgICAgICAgICBTRVRfQUgoIGNvbnRleHQsIDB4MDAgKTsgLyogc3VjY2VzcyAqLwogICAgICAgIGVsc2UKICAgICAgICAgICAgU0VUX0FIKCBjb250ZXh0LCAweDAxICk7IC8qIGZhaWxlZCAqLwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwMzogLyogVkVTQSBTdXBlclZHQSBCSU9TIC0gR0VUIENVUlJFTlQgVklERU8gTU9ERSAqLwogICAgICAgIFNFVF9BTCggY29udGV4dCwgMHg0ZiApOwogICAgICAgIFNFVF9BSCggY29udGV4dCwgMHgwMCApOwogICAgICAgIFNFVF9CWCggY29udGV4dCwgSU5UMTBfR2V0SGVhcCgpLT5WZXNhQ3VycmVudE1vZGUgKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDQ6IC8qIFZFU0EgU3VwZXJWR0EgQklPUyAtIFNBVkUvUkVTVE9SRSBTdXBlclZHQSBWSURFTyBTVEFURSAqLwogICAgICAgIEVSUigiVkVTQSBTQVZFL1JFU1RPUkUgVmlkZW8gU3RhdGUgLSBOb3QgSW1wbGVtZW50ZWRcbiIpOwogICAgICAgIC8qIEFMX3JlZyhjb250ZXh0KSA9IDB4NGY7ID0gc3VwcG9ydGVkIHNvIG5vdCBzZXQgc2luY2Ugbm90IGltcGxlbWVudGVkICovCiAgICAgICAgLyogbWF5YmUgd2Ugc2hvdWxkIGRvIHRoaXMgaW5zdGVhZCA/ICovCiAgICAgICAgLyogQUhfcmVnKGNvbnRleHQgPSAweDAxOyAgbm90IGltcGxlbWVudGVkIHNvIGp1c3QgZmFpbCAqLwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwNTogLyogVkVTQSBTdXBlclZHQSBCSU9TIC0gQ1BVIFZJREVPIE1FTU9SWSBDT05UUk9MICovCiAgICAgICAgLyoKICAgICAgICAgKiBUaGlzIHN1YmZ1bmN0aW9uIHN1cHBvcnRzIG9ubHkgV2luZG93IEEgKEJMX3JlZyA9PSAwKSBhbmQKICAgICAgICAgKiBpcyBhc3N1bWVzIHRoYXQgd2luZG93IGdyYW51bGFyaXR5IGlzIDY0ay4KICAgICAgICAgKi8KICAgICAgICBzd2l0Y2goQkhfcmVnKGNvbnRleHQpKSB7CiAgICAgICAgY2FzZSAweDAwOiAvKiBzZWxlY3QgdmlkZW8gbWVtb3J5IHdpbmRvdyAqLwogICAgICAgICAgICBTRVRfQUwoIGNvbnRleHQsIDB4NGYgKTsgLyogZnVuY3Rpb24gc3VwcG9ydGVkICovCiAgICAgICAgICAgIGlmKEJMX3JlZyhjb250ZXh0KSA9PSAwKSB7CiAgICAgICAgICAgICAgICBWR0FfU2V0V2luZG93U3RhcnQoRFhfcmVnKGNvbnRleHQpICogNjQgKiAxMDI0KTsKICAgICAgICAgICAgICAgIFNFVF9BSCggY29udGV4dCwgMHgwMCApOyAvKiBzdGF0dXM6IHN1Y2Nlc3NmdWwgKi8KICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICBTRVRfQUgoIGNvbnRleHQsIDB4MDEgKTsgLyogc3RhdHVzOiBmYWlsZWQgKi8KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDAxOiAvKiBnZXQgdmlkZW8gbWVtb3J5IHdpbmRvdyAqLwogICAgICAgICAgICBTRVRfQUwoIGNvbnRleHQsIDB4NGYgKTsgLyogZnVuY3Rpb24gc3VwcG9ydGVkICovCiAgICAgICAgICAgIGlmKEJMX3JlZyhjb250ZXh0KSA9PSAwKSB7CiAgICAgICAgICAgICAgICBTRVRfRFgoIGNvbnRleHQsIFZHQV9HZXRXaW5kb3dTdGFydCgpIC8gNjQgLyAxMDI0ICk7CiAgICAgICAgICAgICAgICBTRVRfQUgoIGNvbnRleHQsIDB4MDAgKTsgLyogc3RhdHVzOiBzdWNjZXNzZnVsICovCiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgU0VUX0FIKCBjb250ZXh0LCAweDAxICk7IC8qIHN0YXR1czogZmFpbGVkICovCiAgICAgICAgICAgIGJyZWFrOwoJZGVmYXVsdDoKICAgICAgICAgICAgSU5UX0JBUkYoIGNvbnRleHQsIDB4MTAgKTsKCX0KICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDY6IC8qIFZFU0EgR0VUL1NFVCBMT0dJQ0FMIFNDQU4gTElORSBMRU5HVEggKi8KICAgICAgICBFUlIoIlZFU0EgR0VUL1NFVCBMT0dJQ0FMIFNDQU4gTElORSBMRU5HVEggLSBOb3QgSW1wbGVtZW50ZWRcbiIpOwogICAgICAgIC8qIEFMX3JlZyhjb250ZXh0KSA9IDB4NGY7ID0gc3VwcG9ydGVkIHNvIG5vdCBzZXQgc2luY2Ugbm90IGltcGxlbWVudGVkICovCiAgICAgICAgLyogbWF5YmUgd2Ugc2hvdWxkIGRvIHRoaXMgaW5zdGVhZCA/ICovCiAgICAgICAgLyogQUhfcmVnKGNvbnRleHQgPSAweDAwMTsgbm90IGltcGxlbWVudGVkIHNvIGp1c3QgZmFpbCAqLwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwNzogLyogR0VUL1NFVCBESVNQTEFZIFNUQVJUICovCiAgICAgICAgRVJSKCJWRVNBIEdFVC9TRVQgRElTUExBWSBTVEFSVCAtIE5vdCBJbXBsZW1lbnRlZFxuIik7CiAgICAgICAgLyogQUxfcmVnKGNvbnRleHQpID0gMHg0ZjsgPSBzdXBwb3J0ZWQgc28gbm90IHNldCBzaW5jZSBub3QgaW1wbGVtZW50ZWQgKi8KICAgICAgICAvKiBtYXliZSB3ZSBzaG91bGQgZG8gdGhpcyBpbnN0ZWFkID8gKi8KICAgICAgICAvKiBBSF9yZWcoY29udGV4dCA9IDB4MDAxOyBub3QgaW1wbGVtZW50ZWQgc28ganVzdCBmYWlsICovCiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDA4OiAvKiBHRVQvU0VUIERBQyBQQUxFVFRFIENPTlRST0wgKi8KICAgICAgICBFUlIoIlZFU0EgR0VUL1NFVCBEQUMgUEFMRVRURSBDT05UUk9MLSBOb3QgSW1wbGVtZW50ZWRcbiIpOwogICAgICAgIC8qIEFMX3JlZyhjb250ZXh0KSA9IDB4NGY7ID0gc3VwcG9ydGVkIHNvIG5vdCBzZXQgc2luY2Ugbm90IGltcGxlbWVudGVkICovCiAgICAgICAgLyogbWF5YmUgd2Ugc2hvdWxkIGRvIHRoaXMgaW5zdGVhZCA/ICovCiAgICAgICAgLyogQUhfcmVnKGNvbnRleHQgPSAweDAwMTsgbm90IGltcGxlbWVudGVkIHNvIGp1c3QgZmFpbCAqLwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwOTogLyogU0VUIFBBTEVUVEUgRU5UUklFUyAqLwogICAgICAgIEZJWE1FKCJWRVNBIFNldCBwYWxldHRlIGVudHJpZXMgLSBub3QgaW1wbGVtZW50ZWRcbiIpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwYTogLyogR0VUIFBST1RFQ1RFRC1NT0RFIENPREUgKi8KICAgICAgICBGSVhNRSgiVkVTQSBHZXQgcHJvdGVjdGVkLW1vZGUgY29kZSAtIG5vdCBpbXBsZW1lbnRlZFxuIik7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDEwOiAvKiBEaXNwbGF5IFBvd2VyIE1hbmFnZW1lbnQgRXh0ZW5zaW9ucyAqLwogICAgICAgIEZJWE1FKCJWRVNBIERpc3BsYXkgUG93ZXIgTWFuYWdlbWVudCBFeHRlbnNpb25zIC0gbm90IGltcGxlbWVudGVkXG4iKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4ZWY6ICAvKiBnZXQgdmlkZW8gbW9kZSBmb3IgaGVyY3VsZXMtY29tcGF0aWJsZXMgICAqLwogICAgICAgIC8qIFRoZXJlJ3Mgbm8gcmVhc29uIHRvIHJlYWxseSBzdXBwb3J0IHRoaXMgICovCiAgICAgICAgLyogaXMgdGhlcmU/Li4uLi4uLi4uLi4uLi4uLi4uLi4oQS5DLikgICAgICAgKi8KICAgICAgICBUUkFDRSgiSnVzdCByZXBvcnQgdGhlIHZpZGVvIG5vdCBoZXJjdWxlcyBjb21wYXRpYmxlXG4iKTsKICAgICAgICBTRVRfRFgoIGNvbnRleHQsIDB4ZmZmZiApOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHhmZjogLyogVHVybiBWRVNBIE9OL09GRiAqLwogICAgICAgIC8qIGkgZG9udCBrbm93IHdoYXQgdG8gZG8gKi8KICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIEZJWE1FKCJWRVNBIEZ1bmN0aW9uICgweCV4KSAtIE5vdCBTdXBwb3J0ZWRcbiIsIEFIX3JlZyhjb250ZXh0KSk7CiAgICAgICAgYnJlYWs7CiAgICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkgICAgRE9TVk1fSW50MTBIYW5kbGVyCiAqCiAqIEhhbmRsZXIgZm9yIGludCAxMGggKHZpZGVvKS4KICoKICogTk9URToKICogICAgTW9zdCBJTlQgMTAgZnVuY3Rpb25zIGZvciB0ZXh0LW1vZGUsIENHQSwgRUdBLCBhbmQgVkdBIGNhcmRzCiAqICAgIGFyZSBwcmVzZW50IGluIHRoaXMgbGlzdC4gKFNWR0EgYW5kIFhHQSBhcmUgbm90KSBUaGF0IGlzIG5vdAogKiAgICB0byBzYXkgdGhhdCBhbGwgdGhlc2UgZnVuY3Rpb25zIHNob3VsZCBiZSBzdXBwb3J0ZWQsIGJ1dCBpZgogKiAgICBhbnlvbmUgaXMgYnJhaW4tZGFtYWdlZCBlbm91Z2ggdG8gd2FudCB0byBlbXVsYXRlIG9uZSBvZiB0aGVzZQogKiAgICBiZWFzdHMgdGhlbiB0aGlzIHNob3VsZCBnZXQgeW91IHN0YXJ0ZWQuCiAqCiAqIE5PVEU6CiAqICAgIFNldmVyYWwgY29tbW9uIGdyYXBoaWNhbCBleHRlbnNpb25zIHVzZWQgYnkgTWljcm9zb2Z0IGhvb2sKICogICAgb2ZmIG9mIGhlcmUuIEkgaGF2ZSAqbm90KiBhZGRlZCB0aGVtIHRvIHRoaXMgbGlzdCAoeWV0KS4gVGhleQogKiAgICBpbmNsdWRlOgogKgogKiAgICBNU0hFUkMuQ09NIC0gTW9yZSBmdW5jdGlvbmFsaXR5IGZvciBIZXJjdWxlcyBjYXJkcy4KICogICAgRUdBLlNZUyAoYWxzbyBNT1VTRS5DT00pIC0gTW9yZSBmb3IgRUdBIGNhcmRzLgogKgogKiAgICBZZXMsIE1TIGFsc28gYWRkZWQgdGhpcyBzdXBwb3J0IGludG8gdGhlaXIgbW91c2UgZHJpdmVyLiBEb24ndAogKiAgICBhc2sgbWUsIEkgZG9uJ3Qgd29yayBmb3IgdGhlbS4KICoKICogSm9zZXBoIFByYW5ldmljaCAtIDkvOTgKICoKICogIEplc3MgSGFhcyAyLzk5CiAqCUFkZGVkIHN1cHBvcnQgZm9yIFZlc2EuIEl0IGlzIG5vdCBjb21wbGV0ZSBidXQgaXMgYSBzdGFydC4KICoJTk9URTogSW0gbm90IHN1cmUgaWYgaSBkaWQgYWxsIHRoaXMgcmlnaHQgb3IgaWYgZW55IG9mIGl0IHdvcmtzLgogKglDdXJyZW50bHkgaSBkb250IGhhdmUgYSBwcm9ncmFtIHRoYXQgdXNlcyBWZXNhIHRoYXQgYWN0dWFsbHkgZ2V0cyBmYXIKICoJZW5vdWdoIHdpdGhvdXQgY3Jhc2hpbmcgdG8gZG8gdmVzYSBzdHVmZi4KICoKICogICAgICBBZGRlZCBhZGRpdGlvbmFsIHZnYSBncmFwaGljIHN1cHBvcnQgLSAzLzk5CiAqLwp2b2lkIFdJTkFQSSBET1NWTV9JbnQxMEhhbmRsZXIoIENPTlRFWFQ4NiAqY29udGV4dCApCnsKICAgIEJJT1NEQVRBICpkYXRhID0gQklPU19EQVRBOwoKICAgIElOVDEwX0luaXRpYWxpemVWaWRlb01vZGUoIGRhdGEgKTsKCiAgICBzd2l0Y2goQUhfcmVnKGNvbnRleHQpKSB7CgogICAgY2FzZSAweDAwOiAvKiBTRVQgVklERU8gTU9ERSAqLwogICAgICAgIFRSQUNFKCAiU2V0IFZHQSB2aWRlbyBtb2RlICUwMnhcbiIsIEFMX3JlZyhjb250ZXh0KSApOwogICAgICAgIGlmICghSU5UMTBfU2V0VmlkZW9Nb2RlKCBkYXRhLCBBTF9yZWcoY29udGV4dCkgKSkKICAgICAgICAgICAgRklYTUUoICJVbnN1cHBvcnRlZCBWR0EgdmlkZW8gbW9kZSByZXF1ZXN0ZWQ6ICVkXG4iLCAKICAgICAgICAgICAgICAgICAgIEFMX3JlZyhjb250ZXh0KSApOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwMTogLyogU0VUIENVUlNPUiBTSEFQRSAqLwogICAgICAgIFRSQUNFKCJTZXQgQ3Vyc29yIFNoYXBlIHN0YXJ0ICVkIGVuZCAlZCBvcHRpb25zICVkXG4iLAogICAgICAgICAgICAgIENIX3JlZyhjb250ZXh0KSAmIDB4MWYsCiAgICAgICAgICAgICAgQ0xfcmVnKGNvbnRleHQpICYgMHgxZiwKICAgICAgICAgICAgICBDSF9yZWcoY29udGV4dCkgJiAweGUwKTsKICAgICAgICBkYXRhLT5WaWRlb0N1cnNvclR5cGUgPSBDWF9yZWcoY29udGV4dCk7IC8qIGRpcmVjdCBjb3B5ICovCglWR0FfU2V0Q3Vyc29yU2hhcGUoQ0hfcmVnKGNvbnRleHQpLCBDTF9yZWcoY29udGV4dCkpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwMjogLyogU0VUIENVUlNPUiBQT1NJVElPTiAqLwogICAgICAgIC8qIEJIID0gUGFnZSBOdW1iZXIgKi8gLyogTm90IHN1cHBvcnRlZCAqLwogICAgICAgIC8qIERIID0gUm93ICovIC8qIDAgaXMgbGVmdCAqLwogICAgICAgIC8qIERMID0gQ29sdW1uICovIC8qIDAgaXMgdG9wICovCiAgICAgICAgSU5UMTBfU2V0Q3Vyc29yUG9zKGRhdGEsQkhfcmVnKGNvbnRleHQpLERMX3JlZyhjb250ZXh0KSxESF9yZWcoY29udGV4dCkpOwogICAgICAgIGlmIChCSF9yZWcoY29udGV4dCkpCiAgICAgICAgewogICAgICAgICAgIEZJWE1FKCJTZXQgQ3Vyc29yIFBvc2l0aW9uOiBDYW5ub3Qgc2V0IHRvIHBhZ2UgJWRcbiIsCiAgICAgICAgICAgICAgQkhfcmVnKGNvbnRleHQpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICBWR0FfU2V0Q3Vyc29yUG9zKERMX3JlZyhjb250ZXh0KSwgREhfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICBUUkFDRSgiU2V0IEN1cnNvciBQb3NpdGlvbjogJWQvJWRcbiIsIERMX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICBESF9yZWcoY29udGV4dCkpOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDM6IC8qIEdFVCBDVVJTT1IgUE9TSVRJT04gQU5EIFNJWkUgKi8KICAgICAgICB7CiAgICAgICAgICB1bnNpZ25lZCByb3csIGNvbDsKCiAgICAgICAgICBUUkFDRSgiR2V0IGN1cnNvciBwb3NpdGlvbiBhbmQgc2l6ZSAocGFnZSAlZClcbiIsIEJIX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICBTRVRfQ1goIGNvbnRleHQsIGRhdGEtPlZpZGVvQ3Vyc29yVHlwZSApOwogICAgICAgICAgSU5UMTBfR2V0Q3Vyc29yUG9zKGRhdGEsQkhfcmVnKGNvbnRleHQpLCZjb2wsJnJvdyk7CiAgICAgICAgICBTRVRfREgoIGNvbnRleHQsIHJvdyApOwogICAgICAgICAgU0VUX0RMKCBjb250ZXh0LCBjb2wgKTsKICAgICAgICAgIFRSQUNFKCJDdXJzb3IgUG9zaXRpb246ICVkLyVkXG4iLCBETF9yZWcoY29udGV4dCksIERIX3JlZyhjb250ZXh0KSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwNDogLyogUkVBRCBMSUdIVCBQRU4gUE9TSVRJT04gKi8KICAgICAgICBGSVhNRSgiUmVhZCBMaWdodCBQZW4gUG9zaXRpb24gLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICBTRVRfQUgoIGNvbnRleHQsIDB4MDAgKTsgLyogTm90IGRvd24gKi8KICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDU6IC8qIFNFTEVDVCBBQ1RJVkUgRElTUExBWSBQQUdFICovCiAgICAgICAgRklYTUUoIlNlbGVjdCBBY3RpdmUgRGlzcGxheSBQYWdlICglZCkgLSBOb3QgU3VwcG9ydGVkXG4iLCBBTF9yZWcoY29udGV4dCkpOwogICAgICAgIGRhdGEtPlZpZGVvQ3VyUGFnZSA9IEFMX3JlZyhjb250ZXh0KTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDY6IC8qIFNDUk9MTCBVUCBXSU5ET1cgKi8KICAgICAgICAvKiBBTCA9IExpbmVzIHRvIHNjcm9sbCAqLwogICAgICAgIC8qIEJIID0gQXR0cmlidXRlICovCiAgICAgICAgLyogQ0gsQ0wgPSByb3csIGNvbCB1cHBlci1sZWZ0ICovCiAgICAgICAgLyogREgsREwgPSByb3csIGNvbCBsb3dlci1yaWdodCAqLwogICAgICAgIFRSQUNFKCJTY3JvbGwgVXAgV2luZG93ICVkXG4iLCBBTF9yZWcoY29udGV4dCkpOwoKICAgICAgICBpZiAoQUxfcmVnKGNvbnRleHQpID09IDApCiAgICAgICAgICAgIFZHQV9DbGVhclRleHQoIENIX3JlZyhjb250ZXh0KSwgQ0xfcmVnKGNvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBESF9yZWcoY29udGV4dCksIERMX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQkhfcmVnKGNvbnRleHQpICk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBWR0FfU2Nyb2xsVXBUZXh0KCBDSF9yZWcoY29udGV4dCksIENMX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREhfcmVnKGNvbnRleHQpLCBETF9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMX3JlZyhjb250ZXh0KSwgQkhfcmVnKGNvbnRleHQpICk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDA3OiAvKiBTQ1JPTEwgRE9XTiBXSU5ET1cgKi8KICAgICAgICAvKiBBTCA9IExpbmVzIHRvIHNjcm9sbCAqLwogICAgICAgIC8qIEJIID0gQXR0cmlidXRlICovCiAgICAgICAgLyogQ0gsQ0wgPSByb3csIGNvbCB1cHBlci1sZWZ0ICovCiAgICAgICAgLyogREgsREwgPSByb3csIGNvbCBsb3dlci1yaWdodCAqLwogICAgICAgIFRSQUNFKCJTY3JvbGwgRG93biBXaW5kb3cgJWRcbiIsIEFMX3JlZyhjb250ZXh0KSk7CgogICAgICAgIGlmIChBTF9yZWcoY29udGV4dCkgPT0gMCkKICAgICAgICAgICAgVkdBX0NsZWFyVGV4dCggQ0hfcmVnKGNvbnRleHQpLCBDTF9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIERIX3JlZyhjb250ZXh0KSwgRExfcmVnKGNvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBCSF9yZWcoY29udGV4dCkgKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIFZHQV9TY3JvbGxEb3duVGV4dCggQ0hfcmVnKGNvbnRleHQpLCBDTF9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREhfcmVnKGNvbnRleHQpLCBETF9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxfcmVnKGNvbnRleHQpLCBCSF9yZWcoY29udGV4dCkgKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDg6IC8qIFJFQUQgQ0hBUkFDVEVSIEFORCBBVFRSSUJVVEUgQVQgQ1VSU09SIFBPU0lUSU9OICovCiAgICAgICAgewogICAgICAgICAgICBpZiAoQkhfcmVnKGNvbnRleHQpKSAvKiBXcml0ZSB0byBkaWZmZXJlbnQgcGFnZSAqLwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBGSVhNRSgiUmVhZCBjaGFyYWN0ZXIgYW5kIGF0dHJpYnV0ZSBhdCBjdXJzb3IgcG9zaXRpb24gLSIKICAgICAgICAgICAgICAgICAgICAgICIgQ2FuJ3QgcmVhZCBmcm9tIG5vbi0wIHBhZ2VcbiIpOwogICAgICAgICAgICAgICAgU0VUX0FMKCBjb250ZXh0LCAnICcgKTsgLyogVGhhdCBwYWdlIGlzIGJsYW5rICovCiAgICAgICAgICAgICAgICBTRVRfQUgoIGNvbnRleHQsIDcgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgewogICAgICAgICAgICAgICAgQllURSBhc2NpaSwgYXR0cjsKICAgICAgICAgICAgICAgIFRSQUNFKCJSZWFkIENoYXJhY3RlciBhbmQgQXR0cmlidXRlIGF0IEN1cnNvciBQb3NpdGlvblxuIik7CiAgICAgICAgICAgICAgICBWR0FfR2V0Q2hhcmFjdGVyQXRDdXJzb3IoJmFzY2lpLCAmYXR0cik7CiAgICAgICAgICAgICAgICBTRVRfQUwoIGNvbnRleHQsIGFzY2lpICk7CiAgICAgICAgICAgICAgICBTRVRfQUgoIGNvbnRleHQsIGF0dHIgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDk6IC8qIFdSSVRFIENIQVJBQ1RFUiBBTkQgQVRUUklCVVRFIEFUIENVUlNPUiBQT1NJVElPTiAqLwogICAgY2FzZSAweDBhOiAvKiBXUklURSBDSEFSQUNURVIgT05MWSBBVCBDVVJTT1IgUE9TSVRJT04gKi8KICAgICAgIC8qIEFMID0gQ2hhcmFjdGVyIHRvIGRpc3BsYXkuICovCiAgICAgICAvKiBCSCA9IFBhZ2UgTnVtYmVyICovIC8qIFdlIGNhbid0IHdyaXRlIHRvIG5vbi0wIHBhZ2VzLCB5ZXQuICovCiAgICAgICAvKiBCTCA9IEF0dHJpYnV0ZSAvIENvbG9yICovCiAgICAgICAvKiBDWCA9IFRpbWVzIHRvIFdyaXRlIENoYXIgKi8KICAgICAgIC8qIE5vdGUgaGVyZSB0aGF0IHRoZSBjdXJzb3IgaXMgbm90IGFkdmFuY2VkLiAqLwogICAgICAgewogICAgICAgICAgIHVuc2lnbmVkIHJvdywgY29sOwoKICAgICAgICAgICBJTlQxMF9HZXRDdXJzb3JQb3MoZGF0YSxCSF9yZWcoY29udGV4dCksJmNvbCwmcm93KTsKICAgICAgICAgICBWR0FfV3JpdGVDaGFycyhjb2wsIHJvdywKICAgICAgICAgICAgICAgICAgICAgICAgICBBTF9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgKEFIX3JlZyhjb250ZXh0KSA9PSAweDA5KSA/IEJMX3JlZyhjb250ZXh0KSA6IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgIENYX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgaWYgKENYX3JlZyhjb250ZXh0KSA+IDEpCiAgICAgICAgICAgICAgVFJBQ0UoIldyaXRlIENoYXJhY3RlciVzIGF0IEN1cnNvciBQb3NpdGlvbiAoUmVwLiAlZCk6ICVjXG4iLAogICAgICAgICAgICAgICAgICAgIChBSF9yZWcoY29udGV4dCkgPT0gMHgwOSkgPyAiIGFuZCBBdHRyaWJ1dGUiIDogIiIsCiAgICAgICAgICAgICAgICAgQ1hfcmVnKGNvbnRleHQpLCBBTF9yZWcoY29udGV4dCkpOwogICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICBUUkFDRSgiV3JpdGUgQ2hhcmFjdGVyJXMgYXQgQ3Vyc29yIFBvc2l0aW9uOiAlY1xuIiwKICAgICAgICAgICAgICAgICAgICAoQUhfcmVnKGNvbnRleHQpID09IDB4MDkpID8gIiBhbmQgQXR0cmlidXRlIiA6ICIiLAogICAgICAgICAgICAgICAgQUxfcmVnKGNvbnRleHQpKTsKICAgICAgIH0KICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwYjoKICAgICAgICBzd2l0Y2ggQkhfcmVnKGNvbnRleHQpIHsKICAgICAgICBjYXNlIDB4MDA6IC8qIFNFVCBCQUNLR1JPVU5EL0JPUkRFUiBDT0xPUiAqLwogICAgICAgICAgICAvKiBJbiB0ZXh0IG1vZGVzLCB0aGlzIHNldHMgb25seSB0aGUgYm9yZGVyLi4uICovCiAgICAgICAgICAgIC8qIEFjY29yZGluZyB0byB0aGUgaW50ZXJydXB0IGxpc3QgYW5kIG9uZSBvZiBteSBib29rcy4gKi8KICAgICAgICAgICAgLyogRnVubnkgdGhvdWdoIHRoYXQgQmV5b25kIFpvcmsgc2VlbXMgdG8gaW5kaWNhdGUgdGhhdCBpdAogICAgICAgICAgICAgICBhbHNvIHNldHMgdXAgdGhlIGRlZmF1bHQgYmFja2dyb3VuZCBhdHRyaWJ1dGVzIGZvciBjbGVhcnMKICAgICAgICAgICAgICAgYW5kIHNjcm9sbHMuLi4gKi8KICAgICAgICAgICAgLyogQmVhciBpbiBtaW5kIGhlcmUgdGhhdCB3ZSBkbyBub3Qgd2FudCB0byBjaGFuZ2UsCiAgICAgICAgICAgICAgIGFwcGFyZW50bHksIHRoZSBmb3JlZ3JvdW5kIG9yIGF0dHJpYnV0ZSBvZiB0aGUgYmFja2dyb3VuZAogICAgICAgICAgICAgICB3aXRoIHRoaXMgY2FsbCwgc28gd2Ugc2hvdWxkIGNoZWNrIGZpcnN0IHRvIHNlZSB3aGF0IHRoZQogICAgICAgICAgICAgICBmb3JlZ3JvdW5kIGFscmVhZHkgaXMuLi4gRklYTUUgKi8KICAgICAgICAgICAgRklYTUUoIlNldCBCYWNrZ3JvdW5kL0JvcmRlciBDb2xvcjogJWQvJWRcbiIsCiAgICAgICAgICAgICAgIEJIX3JlZyhjb250ZXh0KSwgQkxfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDAxOiAvKiBTRVQgUEFMRVRURSAqLwogICAgICAgICAgICBGSVhNRSgiU2V0IFBhbGV0dGUgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRklYTUUoIklOVCAxMCBBSCA9IDB4MGIgQkggPSAweCV4IC0gVW5rbm93blxuIiwKICAgICAgICAgICAgICAgQkhfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwYzogLyogV1JJVEUgR1JBUEhJQ1MgUElYRUwgKi8KICAgICAgICAvKiBOb3QgaW4gZ3JhcGhpY3MgbW9kZSwgY2FuIGlnbm9yZSB3L28gZXJyb3IgKi8KICAgICAgICBGSVhNRSgiV3JpdGUgR3JhcGhpY3MgUGl4ZWwgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MGQ6IC8qIFJFQUQgR1JBUEhJQ1MgUElYRUwgKi8KICAgICAgICAvKiBOb3QgaW4gZ3JhcGhpY3MgbW9kZSwgY2FuIGlnbm9yZSB3L28gZXJyb3IgKi8KICAgICAgICBGSVhNRSgiUmVhZCBHcmFwaGljcyBQaXhlbCAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwZTogLyogVEVMRVRZUEUgT1VUUFVUICovCiAgICAgICAgVFJBQ0UoIlRlbGV0eXBlIE91dHB1dFxuIik7CiAgICAgICAgRE9TVk1fUHV0Q2hhcihBTF9yZWcoY29udGV4dCkpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwZjogLyogR0VUIENVUlJFTlQgVklERU8gTU9ERSAqLwogICAgICAgIFRSQUNFKCJHZXQgY3VycmVudCB2aWRlbyBtb2RlOiAtPiBtb2RlICVkLCBjb2x1bW5zICVkXG4iLCBkYXRhLT5WaWRlb01vZGUsIGRhdGEtPlZpZGVvQ29sdW1ucyk7CiAgICAgICAgLyogTm90ZTogVGhpcyBzaG91bGQgbm90IGJlIGEgY29uc3RhbnQgdmFsdWUuICovCiAgICAgICAgU0VUX0FMKCBjb250ZXh0LCBkYXRhLT5WaWRlb01vZGUgKTsKICAgICAgICBTRVRfQUgoIGNvbnRleHQsIGRhdGEtPlZpZGVvQ29sdW1ucyApOwogICAgICAgIFNFVF9CSCggY29udGV4dCwgMCApOyAvKiBEaXNwbGF5IHBhZ2UgMCAqLwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgxMDoKICAgICAgICBzd2l0Y2ggQUxfcmVnKGNvbnRleHQpIHsKICAgICAgICBjYXNlIDB4MDA6IC8qIFNFVCBTSU5HTEUgUEFMRVRURSBSRUdJU1RFUiAtIEEuQy4gKi8KICAgICAgICAgICAgVFJBQ0UoIlNldCBTaW5nbGUgUGFsZXR0ZSBSZWdpc3RlciAtIFJlZyAweDAleCBWYWx1ZSAweDAleFxuIiwKCQlCTF9yZWcoY29udGV4dCksQkhfcmVnKGNvbnRleHQpKTsKCQkvKiBCSCBpcyB0aGUgdmFsdWUgIEJMIGlzIHRoZSByZWdpc3RlciAqLwoJCVZHQV9TZXRDb2xvcjE2KChpbnQpQkxfcmVnKGNvbnRleHQpLChpbnQpQkhfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDAxOiAvKiBTRVQgQk9SREVSIChPVkVSU0NBTikgKi8KICAgICAgICAgICAgLyogVGV4dCB0ZXJtaW5hbHMgaGF2ZSBubyBvdmVyc2NhbiAqLwoJICAgIC8qIEknbSBzZXR0aW5nIGl0IGFueXdheS4gLSBBLkMuICAgKi8KICAgICAgICAgICAgVFJBQ0UoIlNldCBCb3JkZXIgKE92ZXJzY2FuKSAtIElnbm9yZWQgYnV0IHNldC5cbiIpOwoJICAgIFZHQV9TZXRDb2xvcjE2KDE2LChpbnQpQkhfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDAyOiAvKiBTRVQgQUxMIFBBTEVUVEUgUkVHSVNURVJTIC0gQS5DLiovCiAgICAgICAgICAgIFRSQUNFKCJTZXQgYWxsIHBhbGV0dGUgcmVnaXN0ZXJzXG4iKTsKCQkvKiBFUzpEWCBwb2ludHMgdG8gYSAxNyBieXRlIHRhYmxlIG9mIGNvbG9ycyAqLwoJCS8qIE5vIHJldHVybiBkYXRhIGxpc3RlZCAqLwoJCS8qIEknbGwgaGF2ZSB0byB1cGRhdGUgbXkgdGFibGUgYW5kIHRoZSBkZWZhdWx0IHBhbGV0dGUgKi8KICAgICAgICAgICAgICAgVkdBX1NldDE2UGFsZXR0ZShDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgY29udGV4dC0+U2VnRXMsIGNvbnRleHQtPkVkeCkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDM6IC8qIFRPR0dMRSBJTlRFTlNJVFkvQkxJTktJTkcgQklUICovCiAgICAgICAgICAgIEZJWE1FKCJUb2dnbGUgSW50ZW5zaXR5L0JsaW5raW5nIEJpdCAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDc6IC8qIEdFVCBJTkRJVklEVUFMIFBBTEVUVEUgUkVHSVNURVIgIC0gQS5DLiovCiAgICAgICAgICAgIFRSQUNFKCJHZXQgSW5kaXZpZHVhbCBQYWxldHRlIFJlZ2lzdGVyIDB4MCV4XG4iLEJMX3JlZyhjb250ZXh0KSk7CgkJLyogQkwgaXMgcmVnaXN0ZXIgdG8gcmVhZCBbIDAtMTUgXSBCSCBpcyByZXR1cm4gdmFsdWUgKi8KCSAgICAgICAgU0VUX0JIKCBjb250ZXh0LCBWR0FfR2V0Q29sb3IxNigoaW50KUJMX3JlZyhjb250ZXh0KSkgKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDA4OiAvKiBSRUFEIE9WRVJTQ0FOIChCT1JERVIgQ09MT1IpIFJFR0lTVEVSICAtIEEuQy4gKi8KICAgICAgICAgICAgVFJBQ0UoIlJlYWQgT3ZlcnNjYW4gKEJvcmRlciBDb2xvcikgUmVnaXN0ZXIgXG4iKTsKCSAgICAgICAgU0VUX0JIKCBjb250ZXh0LCBWR0FfR2V0Q29sb3IxNigxNikgKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDA5OiAvKiBSRUFEIEFMTCBQQUxFVFRFIFJFR0lTVEVSUyBBTkQgT1ZFUlNDQU4gUkVHSVNURVIgLSBBLkMuKi8KICAgICAgICAgICAgVFJBQ0UoIlJlYWQgQWxsIFBhbGV0dGUgUmVnaXN0ZXJzIGFuZCBPdmVyc2NhbiBSZWdpc3RlciBcbiIpOwoJCS8qIEVTOkRYIHBvaW50cyB0byBhIDE3IGJ5dGUgdGFibGUgd2hlcmUgdGhlIHJlc3VsdHMgKi8KCQkvKiAgb2YgdGhpcyBjYWxsIHNob3VsZCBiZSBzdG9yZWQuICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgIFZHQV9HZXQxNlBhbGV0dGUoQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsIGNvbnRleHQtPlNlZ0VzLCBjb250ZXh0LT5FZHgpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDEwOiAvKiBTRVQgSU5ESVZJRFVBTCBEQUMgUkVHSVNURVIgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgUEFMRVRURUVOVFJZIHBhbGRhdDsKCiAgICAgICAgICAgICAgICBUUkFDRSgiU2V0IEluZGl2aWR1YWwgREFDIHJlZ2lzdGVyXG4iKTsKICAgICAgICAgICAgICAgIHBhbGRhdC5wZVJlZCAgID0gREhfcmVnKGNvbnRleHQpOwogICAgICAgICAgICAgICAgcGFsZGF0LnBlR3JlZW4gPSBDSF9yZWcoY29udGV4dCk7CiAgICAgICAgICAgICAgICBwYWxkYXQucGVCbHVlICA9IENMX3JlZyhjb250ZXh0KTsKICAgICAgICAgICAgICAgIHBhbGRhdC5wZUZsYWdzID0gMDsKICAgICAgICAgICAgICAgIFZHQV9TZXRQYWxldHRlKCZwYWxkYXQsQlhfcmVnKGNvbnRleHQpJjB4RkYsMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDEyOiAvKiBTRVQgQkxPQ0sgT0YgREFDIFJFR0lTVEVSUyAqLwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnQgaTsKICAgICAgICAgICAgICAgIFBBTEVUVEVFTlRSWSBwYWxkYXQ7CiAgICAgICAgICAgICAgICBCWVRFICpwdDsKCiAgICAgICAgICAgICAgICBUUkFDRSgiU2V0IEJsb2NrIG9mIERBQyByZWdpc3RlcnNcbiIpOwoJCXB0ID0gKEJZVEUqKUNUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LGNvbnRleHQtPlNlZ0VzLGNvbnRleHQtPkVkeCk7CgkJZm9yIChpPTA7aTxDWF9yZWcoY29udGV4dCk7aSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHBhbGRhdC5wZVJlZCAgID0gKCoocHQraSozKzApKSA8PCAyOwogICAgICAgICAgICAgICAgICAgIHBhbGRhdC5wZUdyZWVuID0gKCoocHQraSozKzEpKSA8PCAyOwogICAgICAgICAgICAgICAgICAgIHBhbGRhdC5wZUJsdWUgID0gKCoocHQraSozKzIpKSA8PCAyOwogICAgICAgICAgICAgICAgICAgIHBhbGRhdC5wZUZsYWdzID0gMDsKICAgICAgICAgICAgICAgICAgICBWR0FfU2V0UGFsZXR0ZSgmcGFsZGF0LChCWF9yZWcoY29udGV4dCkraSkmMHhGRiwxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MTM6IC8qIFNFTEVDVCBWSURFTyBEQUMgQ09MT1IgUEFHRSAqLwogICAgICAgICAgICBGSVhNRSgiU2VsZWN0IHZpZGVvIERBQyBjb2xvciBwYWdlIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxNTogLyogUkVBRCBJTkRJVklEVUFMIERBQyBSRUdJU1RFUiAqLwogICAgICAgICAgICBGSVhNRSgiUmVhZCBpbmRpdmlkdWFsIERBQyByZWdpc3RlciAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MTc6IC8qIFJFQUQgQkxPQ0sgT0YgREFDIFJFR0lTVEVSUyAqLwogICAgICAgICAgICBGSVhNRSgiUmVhZCBibG9jayBvZiBEQUMgcmVnaXN0ZXJzIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxODogLyogU0VUIFBFTCBNQVNLICovCiAgICAgICAgICAgIEZJWE1FKCJTZXQgUEVMIG1hc2sgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDE5OiAvKiBSRUFEIFBFTCBNQVNLICovCiAgICAgICAgICAgIEZJWE1FKCJSZWFkIFBFTCBtYXNrIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxYTogLyogR0VUIFZJREVPIERBQyBDT0xPUiBQQUdFIFNUQVRFICovCiAgICAgICAgICAgIEZJWE1FKCJHZXQgdmlkZW8gREFDIGNvbG9yIHBhZ2Ugc3RhdGUgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDFiOiAvKiBQRVJGT1JNIEdSQVktU0NBTEUgU1VNTUlORyAqLwogICAgICAgICAgICBGSVhNRSgiUGVyZm9ybSBHcmF5LXNjYWxlIHN1bW1pbmcgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRklYTUUoIklOVCAxMCBBSCA9IDB4MTAgQUwgPSAweCV4IC0gVW5rbm93blxuIiwKICAgICAgICAgICAgICAgQUxfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgxMTogLyogVEVYVCBNT0RFIENIQVJHRU4gKi8KICAgICAgICAvKiBOb3RlIHRoYXQgc2Vjb25kIHN1YmZ1bmN0aW9uIGlzICphbG1vc3QqIGlkZW50aWNhbC4gKi8KICAgICAgICAvKiBTZWUgSU5URVJSVVBULkEgZm9yIGRldGFpbHMuICovCiAgICAgICAgc3dpdGNoIEFMX3JlZyhjb250ZXh0KSB7CiAgICAgICAgY2FzZSAweDAwOiAvKiBMT0FEIFVTRVIgU1BFQ0lGSUVEIFBBVFRFUk5TICovCiAgICAgICAgY2FzZSAweDEwOgogICAgICAgICAgICBGSVhNRSgiTG9hZCBVc2VyIFNwZWNpZmllZCBQYXR0ZXJucyAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDE6IC8qIExPQUQgUk9NIE1PTk9DSFJPTUUgUEFUVEVSTlMgKi8KICAgICAgICBjYXNlIDB4MTE6CiAgICAgICAgICAgIEZJWE1FKCJMb2FkIFJPTSBNb25vY2hyb21lIFBhdHRlcm5zIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMjogLyogTE9BRCBST00gOHg4IERPVUJMRS1ET1QgUEFUVEVSTlMgKi8KICAgICAgICBjYXNlIDB4MTI6CiAgICAgICAgICAgIEZJWE1FKAogICAgICAgICAgICAgICAgIkxvYWQgUk9NIDh4OCBEb3VibGUgRG90IFBhdHRlcm5zIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMzogLyogU0VUIEJMT0NLIFNQRUNJRklFUiAqLwogICAgICAgICAgICBGSVhNRSgiU2V0IEJsb2NrIFNwZWNpZmllciAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDQ6IC8qIExPQUQgUk9NIDh4MTYgQ0hBUkFDVEVSIFNFVCAqLwogICAgICAgIGNhc2UgMHgxNDoKICAgICAgICAgICAgRklYTUUoIkxvYWQgUk9NIDh4MTYgQ2hhcmFjdGVyIFNldCAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MjA6IC8qIFNFVCBVU0VSIDh4MTYgR1JBUEhJQ1MgQ0hBUlMgKi8KICAgICAgICAgICAgRklYTUUoIlNldCBVc2VyIDh4MTYgR3JhcGhpY3MgQ2hhcnMgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDIxOiAvKiBTRVQgVVNFUiBHUkFQSUNTIENIQVJBQ1RFUlMgKi8KICAgICAgICAgICAgRklYTUUoIlNldCBVc2VyIEdyYXBoaWNzIENoYXJhY3RlcnMgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDIyOiAvKiBTRVQgUk9NIDh4MTQgR1JBUEhJQ1MgQ0hBUlMgKi8KICAgICAgICAgICAgRklYTUUoIlNldCBST00gOHgxNCBHcmFwaGljcyBDaGFycyAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MjM6IC8qIFNFVCBST00gOHg4IERCTCBET1QgQ0hBUlMgKi8KICAgICAgICAgICAgRklYTUUoCiAgICAgICAgICAgICAgICAiU2V0IFJPTSA4eDggRGJsIERvdCBDaGFycyAoR3JhcGhpY3MpIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgyNDogLyogTE9BRCA4eDE2IEdSQVBISUMgQ0hBUlMgKi8KICAgICAgICAgICAgRklYTUUoIkxvYWQgOHgxNiBHcmFwaGljIENoYXJzIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgzMDogLyogR0VUIEZPTlQgSU5GT1JNQVRJT04gKi8KICAgICAgICAgICAgRklYTUUoIkdldCBGb250IEluZm9ybWF0aW9uIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIEZJWE1FKCJJTlQgMTAgQUggPSAweDExIEFMID0gMHgleCAtIFVua25vd25cbiIsCiAgICAgICAgICAgICAgIEFMX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MTI6IC8qIEFMVEVSTkFURSBGVU5DVElPTiBTRUxFQ1QgKi8KICAgICAgICBzd2l0Y2ggQkxfcmVnKGNvbnRleHQpIHsKICAgICAgICBjYXNlIDB4MTA6IC8qIEdFVCBFR0EgSU5GTyAqLwogICAgICAgICAgICBUUkFDRSgiRUdBIGluZm8gcmVxdWVzdGVkXG4iKTsKICAgICAgICAgICAgU0VUX0JIKCBjb250ZXh0LCAweDAwICk7ICAgLyogQ29sb3Igc2NyZWVuICovCiAgICAgICAgICAgIFNFVF9CTCggY29udGV4dCwgZGF0YS0+TW9kZU9wdGlvbnMgPj4gNSApOyAvKiBFR0EgbWVtb3J5IHNpemUgKi8KICAgICAgICAgICAgU0VUX0NYKCBjb250ZXh0LCBkYXRhLT5GZWF0dXJlQml0c1N3aXRjaGVzICk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgyMDogLyogQUxURVJOQVRFIFBSVFNDICovCiAgICAgICAgICAgIEZJWE1FKCJJbnN0YWxsIEFsdGVybmF0ZSBQcmludCBTY3JlZW4gLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDMwOiAvKiBTRUxFQ1QgVkVSVElDQUwgUkVTT1VMVElPTiAqLwogICAgICAgICAgICBGSVhNRSgiU2VsZWN0IHZlcnRpY2FsIHJlc29sdXRpb24gLSBub3Qgc3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDMxOiAvKiBFTkFCTEUvRElTQUJMRSBERUZBVUxUIFBBTEVUVEUgTE9BRElORyAqLwogICAgICAgICAgICBGSVhNRSgiRGVmYXVsdCBwYWxldHRlIGxvYWRpbmcgLSBub3Qgc3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgZGF0YS0+VkdBU2V0dGluZ3MgPQogICAgICAgICAgICAgICAgKGRhdGEtPlZHQVNldHRpbmdzICYgMHhmNykgfAogICAgICAgICAgICAgICAgKChBTF9yZWcoY29udGV4dCkgPT0gMSkgPDwgMyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgzMjogLyogRU5BQkxFL0RJU0FCTEUgVklERU8gQUREUkVSU1NJTkcgKi8KICAgICAgICAgICAgRklYTUUoIlZpZGVvIEFkZHJlc3NpbmcgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDMzOiAvKiBFTkFCTEUvRElTQUJMRSBHUkFZIFNDQUxFIFNVTU1JTkcgKi8KICAgICAgICAgICAgRklYTUUoIkdyYXkgU2NhbGUgU3VtbWluZyAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MzQ6IC8qIEVOQUJMRS9ESVNBQkxFIENVUlNPUiBFTVVMQVRJT04gKi8KICAgICAgICAgICAgVFJBQ0UoIlNldCBjdXJzb3IgZW11bGF0aW9uIHRvICVkXG4iLCBBTF9yZWcoY29udGV4dCkpOwogICAgICAgICAgICBkYXRhLT5Nb2RlT3B0aW9ucyA9CiAgICAgICAgICAgICAgICAoZGF0YS0+TW9kZU9wdGlvbnMgJiAweGZlKXwoQUxfcmVnKGNvbnRleHQpID09IDEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MzY6IC8qIFZJREVPIEFERFJFU1MgQ09OVFJPTCAqLwogICAgICAgICAgICBGSVhNRSgiVmlkZW8gQWRkcmVzcyBDb250cm9sIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIEZJWE1FKCJJTlQgMTAgQUggPSAweDExIEFMID0gMHgleCAtIFVua25vd25cbiIsCiAgICAgICAgICAgICAgIEFMX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MTM6IC8qIFdSSVRFIFNUUklORyAqLwogICAgICAgIC8qIFRoaXMgb25lIGRvZXMgbm90IGltcGx5IHRoYXQgc3RyaW5nIGJlIGF0IGN1cnNvci4gKi8KICAgICAgICBGSVhNRSgiV3JpdGUgU3RyaW5nIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDFhOgogICAgICAgIHN3aXRjaCBBTF9yZWcoY29udGV4dCkgewogICAgICAgIGNhc2UgMHgwMDogLyogR0VUIERJU1BMQVkgQ09NQklOQVRJT04gQ09ERSAqLwogICAgICAgICAgICBUUkFDRSgiR2V0IERpc3BsYXkgQ29tYmluYXRpb24gQ29kZVxuIik7CiAgICAgICAgICAgIFNFVF9BTCggY29udGV4dCwgMHgxYSApOyAgICAgIC8qIEZ1bmN0aW9uIHN1cHBvcnRlZCAqLwogICAgICAgICAgICBTRVRfQkwoIGNvbnRleHQsIElOVDEwX0RDQyApOyAvKiBBY3RpdmUgZGlzcGxheSAqLwogICAgICAgICAgICBTRVRfQkgoIGNvbnRleHQsIDB4MDAgKTsgICAgICAvKiBObyBhbHRlcm5hdGUgZGlzcGxheSAqLwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDE6IC8qIFNFVCBESVNQTEFZIENPTUJJTkFUSU9OIENPREUgKi8KICAgICAgICAgICAgRklYTUUoIlNldCBEaXNwbGF5IENvbWJpbmF0aW9uIENvZGUgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRklYTUUoIklOVCAxMCBBSCA9IDB4MWEgQUwgPSAweCV4IC0gVW5rbm93blxuIiwKICAgICAgICAgICAgICAgQUxfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgYnJlYWs7CgogICAgY2FzZSAweDFiOiAvKiBGVU5DVElPTkFMSVRZL1NUQVRFIElORk9STUFUSU9OICovCiAgICAgICAgVFJBQ0UoIkdldCBmdW5jdGlvbmFsaXR5L3N0YXRlIGluZm9ybWF0aW9uXG4iKTsKICAgICAgICBpZiAoQlhfcmVnKGNvbnRleHQpID09IDB4MDAwMCkKICAgICAgICB7CiAgICAgICAgICAgIEJZVEUgKnB0ciA9IENUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+U2VnRXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+RWRpKTsKICAgICAgICAgICAgU0VUX0FMKCBjb250ZXh0LCAweDFiICk7IC8qIEZ1bmN0aW9uIGlzIHN1cHBvcnRlZCAqLwogICAgICAgICAgICBJTlQxMF9GaWxsU3RhdGVJbmZvcm1hdGlvbiggcHRyLCBkYXRhICk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgxYzogLyogU0FWRS9SRVNUT1JFIFZJREVPIFNUQVRFICovCiAgICAgICAgRklYTUUoIlNhdmUvUmVzdG9yZSBWaWRlbyBTdGF0ZSAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIDB4ZWY6ICAvKiBnZXQgdmlkZW8gbW9kZSBmb3IgaGVyY3VsZXMtY29tcGF0aWJsZXMgICAqLwogICAgICAgICAgICAgICAgICAgIC8qIFRoZXJlJ3Mgbm8gcmVhc29uIHRvIHJlYWxseSBzdXBwb3J0IHRoaXMgICovCiAgICAgICAgICAgICAgICAgICAgLyogaXMgdGhlcmU/Li4uLi4uLi4uLi4uLi4uLi4uLi4oQS5DLikgICAgICAgKi8KICAgICAgICAgICAgICAgIFRSQUNFKCJKdXN0IHJlcG9ydCB0aGUgdmlkZW8gbm90IGhlcmN1bGVzIGNvbXBhdGlibGVcbiIpOwogICAgICAgICAgICAgICAgU0VUX0RYKCBjb250ZXh0LCAweGZmZmYgKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHg0ZjogLyogVkVTQSAqLwogICAgICAgIElOVDEwX0hhbmRsZVZFU0EoY29udGV4dCk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweGZlOiAvKiBHRVQgU0hBRE9XIEJVRkZFUiAqLwogICAgICAgIFRSQUNFKCAiR0VUIFNIQURPVyBCVUZGRVIgJWx4OiV4IC0gaWdub3JlZFxuIiwKICAgICAgICAgICAgICAgY29udGV4dC0+U2VnRXMsIERJX3JlZyhjb250ZXh0KSApOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgRklYTUUoIlVua25vd24gLSAweCV4XG4iLCBBSF9yZWcoY29udGV4dCkpOwogICAgICAgIElOVF9CQVJGKCBjb250ZXh0LCAweDEwICk7CiAgICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIERPU1ZNX1B1dENoYXIKICoKICogV3JpdGUgc2luZ2xlIGNoYXJhY3RlciB0byBWR0EgY29uc29sZSBhdCB0aGUgY3VycmVudCAKICogY3Vyc29yIHBvc2l0aW9uIGFuZCB1cGRhdGVzIHRoZSBCSU9TIGN1cnNvciBwb3NpdGlvbi4KICovCnZvaWQgV0lOQVBJIERPU1ZNX1B1dENoYXIoIEJZVEUgYXNjaWkgKQp7CiAgQklPU0RBVEEgKmRhdGEgPSBCSU9TX0RBVEE7CiAgdW5zaWduZWQgIHhwb3MsIHlwb3M7CgogIFRSQUNFKCJjaGFyOiAweCUwMngoJWMpXG4iLCBhc2NpaSwgYXNjaWkpOwoKICBJTlQxMF9Jbml0aWFsaXplVmlkZW9Nb2RlKCBkYXRhICk7CgogIFZHQV9QdXRDaGFyKCBhc2NpaSApOwogIFZHQV9HZXRDdXJzb3JQb3MoICZ4cG9zLCAmeXBvcyApOwogIElOVDEwX1NldEN1cnNvclBvcyggZGF0YSwgMCwgeHBvcywgeXBvcyApOwp9Cg==