LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBBVE1FTCBNaWNyb2NvbnRyb2xsZXIgU29mdHdhcmUgU3VwcG9ydCANCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqIENvcHlyaWdodCAoYykgMjAwOCwgQXRtZWwgQ29ycG9yYXRpb24NCiAqDQogKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICoNCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6DQogKg0KICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsDQogKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGRpc2NsYWltZXIgYmVsb3cuDQogKg0KICogQXRtZWwncyBuYW1lIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQogKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KICoNCiAqIERJU0NMQUlNRVI6IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVRNRUwgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1INCiAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YNCiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQgQVJFDQogKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBVE1FTCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULA0KICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsDQogKiBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GDQogKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORw0KICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLA0KICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqLw0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8gICAgICAgICBIZWFkZXJzDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojaW5jbHVkZSA8Ym9hcmQuaD4NCiNpbmNsdWRlIDxhZGMvYWRjLmg+DQojaW5jbHVkZSA8dXRpbGl0eS90cmFjZS5oPg0KI2luY2x1ZGUgPHV0aWxpdHkvYXNzZXJ0Lmg+DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vLyBDb25maWd1cmUgdGhlIE1vZGUgUmVnaXN0ZXIgb2YgdGhlIEFEQyBjb250cm9sbGVyDQovLy8gXHBhcmFtIHBBZGMgUG9pbnRlciB0byBhbiBBVDkxU19BREMgaW5zdGFuY2UuDQovLy8gXHBhcmFtIG1vZGUgdmFsdWUgdG8gd3JpdGUgaW4gbW9kZSByZWdpc3Rlcg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQovL3JlcGxhY2VkIHdpdGggbWFjcm8gZGVmaW5pdGlvbiBpbiBhZGMuaA0KDQovL3ZvaWQgQURDX0NmZ01vZGVSZWcoQVQ5MVNfQURDICpwQWRjLCB1bnNpZ25lZCBpbnQgbW9kZSwgdW5zaWduZWQgaW50IGV4dG1vZGUpDQovL3sNCi8vICAgIEFTU0VSVCgobW9kZSYweEYwMDAwMEMwKT09IDAsICJBREMgQmFkIGNvbmZpZ3VyYXRpb24gQURDIE1SIik7DQovLw0KLy8gICAgLy8gV3JpdGUgdG8gdGhlIE1SIHJlZ2lzdGVyDQovLyAgICBwQWRjLT5BRENfTVIgPSBtb2RlOw0KLy99DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyAgICAgICAgIEdsb2JhbCBGdW5jdGlvbnMNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vLyBJbml0aWFsaXplIHRoZSBBREMgY29udHJvbGxlcg0KLy8vIFxwYXJhbSBwQWRjIFBvaW50ZXIgdG8gYW4gQVQ5MVNfQURDIGluc3RhbmNlLg0KLy8vIFxwYXJhbSB0cmdFbiB0cmlnZ2VyIG1vZGUsIHNvZnR3YXJlIG9yIEhhcmR3YXJlDQovLy8gXHBhcmFtIHRyZ1NlbCBoYXJkd2FyZSB0cmlnZ2VyIHNlbGVjdGlvbg0KLy8vIFxwYXJhbSBzbGVlcE1vZGUgc2xlZXAgbW9kZSBzZWxlY3Rpb24NCi8vLyBccGFyYW0gcmVzb2x1dGlvbiByZXNvbHV0aW9uIHNlbGVjdGlvbiA4IGJpdHMgb3IgMTAgYml0cw0KLy8vIFxwYXJhbSBtY2tDbG9jayB2YWx1ZSBvZiBNQ0sgaW4gSHoNCi8vLyBccGFyYW0gYWRjQ2xvY2sgdmFsdWUgb2YgdGhlIEFEQyBjbG9jayBpbiBIeg0KLy8vIFxwYXJhbSBzdGFydHVwVGltZSB2YWx1ZSBvZiB0aGUgc3RhcnQgdXAgdGltZSAoaW4gtXMpIChzZWUgZGF0YXNoZWV0KQ0KLy8vIFxwYXJhbSBzYW1wbGVBbmRIb2xkVGltZSAoaW4gbnMpDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQp2b2lkIEFEQ19Jbml0aWFsaXplIChBVDkxU19BREMgKnBBZGMsDQogICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGlkQWRjLA0KICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciB0cmdFbiwNCiAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdHJnU2VsLA0KICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBzbGVlcE1vZGUsDQogICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHJlc29sdXRpb24sICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtY2tDbG9jaywNCiAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBhZGNDbG9jaywNCiAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzdGFydHVwVGltZSwNCiAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzYW1wbGVBbmRIb2xkVGltZSkNCnsNCiAgICB1bnNpZ25lZCBpbnQgcHJlc2NhbDsNCiAgICB1bnNpZ25lZCBpbnQgc3RhcnR1cDsNCiAgICB1bnNpZ25lZCBpbnQgc2h0aW07DQoNCiAgICBBU1NFUlQoc3RhcnR1cFRpbWU8PUFEQ19TVEFSVFVQX1RJTUVfTUFYLCAiQURDIEJhZCBzdGFydHVwVGltZVxuXHIiKTsNCiAgICBBU1NFUlQoc2FtcGxlQW5kSG9sZFRpbWU+PUFEQ19UUkFDS19IT0xEX1RJTUVfTUlOLCAiQURDIEJhZCBzYW1wbGVBbmRIb2xkVGltZVxuXHIiKTsNCg0KICAgIC8vIEV4YW1wbGU6DQogICAgLy8gNSBNSHogb3BlcmF0aW9uLCAyMLVzIHN0YXJ0dXAgdGltZSwgNjAwbnMgdHJhY2sgYW5kIGhvbGQgdGltZQ0KICAgIC8vIFBSRVNDQUw6IFByZXNjYWxlciBSYXRlIFNlbGVjdGlvbiBBRENDbG9jayA9IE1DSyAvICggKFBSRVNDQUwrMSkgKiAyICkNCiAgICAvLyBQUkVTQ0FMID0gW01DSyAvIChBRENDbG9jayAqIDIpXSAtMSA9IFs0OC8oNSoyKV0tMSA9IDMsOA0KICAgIC8vIFBSRVNDQUwgPSAgNCAtPiA0OC8oKDQrMSkqMikgPSA0OC8xMCA9IDQuOE1Ieg0KICAgIC8vIDQ4LygoMysxKSoyKSA9IDQ4LzggPSA2TUh6DQogICAgLy8gU3RhcnR1cCBUaW1lID0gKFNUQVJUVVArMSkgKiA4IC8gQURDQ2xvY2sNCiAgICAvLyBTVEFSVFVQID0gWyhTdGFydHVwIFRpbWUgKiBBRENDbG9jaykvOF0tMSA9IFsoMjAgMTBlLTYgKiA1MDAwMDAwKS84XS0xID0gMTEsNQ0KICAgIC8vIFNUQVJUVVAgPSAxMSAtPiAoMTErMSkqOC80ODAwMDAwMCA9IDk2LzQ4MDAwMDAgPSAyMLVzDQogICAgLy8NCiAgICAvLyBTYW1wbGUgJiBIb2xkIFRpbWUgPSAoU0hUSU0rMSkgLyBBRENDbG9jaw0KICAgIC8vIFNIVElNID0gKEhvbGRUaW1lICogQURDQ2xvY2spLTEgPSAoNjAwIDEwZS05ICogNTAwMDAwMCktMSA9IDINCiAgICAvLyBTSFRJTSAgID0gIDIgLT4gKDIrMSkvNDgwMDAwMCA9IDEvMTIwMDAwMCA9IDgzM25zDQogICAgcHJlc2NhbCA9IChtY2tDbG9jayAvICgyKmFkY0Nsb2NrKSkgLSAxOw0KICAgIHN0YXJ0dXAgPSAoKGFkY0Nsb2NrLzEwMDAwMDApICogc3RhcnR1cFRpbWUgLyA4KSAtIDE7DQogICAgc2h0aW0gPSAoKChhZGNDbG9jay8xMDAwMDAwKSAqIHNhbXBsZUFuZEhvbGRUaW1lKS8xMDAwKSAtIDE7DQoNCiAgICBBU1NFUlQoIChwcmVzY2FsPDB4M0YpLCAiQURDIEJhZCBQUkVTQ0FMXG5cciIpOw0KICAgIEFTU0VSVChzdGFydHVwPDB4N0YsICJBREMgQmFkIFNUQVJUVVBcblxyIik7DQogICAgQVNTRVJUKHNodGltPDB4RiwgIkFEQyBCYWQgU2FtcGxlQW5kSG9sZFRpbWVcblxyIik7DQoNCiAgICBUUkFDRV9ERUJVRygiYWRjQ2xvY2s6JWQgTWFzdGVyQ2xvY2s6JWRcblxyIiwgKG1ja0Nsb2NrLygocHJlc2NhbCsxKSoyKSksIG1ja0Nsb2NrKTsNCiAgICBUUkFDRV9ERUJVRygicHJlc2NhbDoweCVYIHN0YXJ0dXA6MHglWCBzaHRpbToweCVYXG5cciIsIHByZXNjYWwsIHN0YXJ0dXAsIHNodGltKTsNCiAgICANCiAgICBpZiggYWRjQ2xvY2sgIT0gKG1ja0Nsb2NrLygocHJlc2NhbCsxKSoyKSkgKSB7DQogICAgICAgIFRSQUNFX1dBUk5JTkcoIlVzZXIgYW5kIGNhbGN1bGF0ZWQgYWRjQ2xvY2tzIGFyZSBkaWZmZXJlbnQgOiB1c2VyPSVkIGNhbGM9JWRcblxyIiwgDQogICAgICAgICAgICBhZGNDbG9jaywgKG1ja0Nsb2NrLygocHJlc2NhbCsxKSoyKSkpOw0KICAgIH0NCg0KICAgIC8vIEVuYWJsZSBwZXJpcGhlcmFsIGNsb2NrICAgIA0KICAgIEFUOTFDX0JBU0VfUE1DLT5QTUNfUENFUiA9IDEgPDwgaWRBZGM7ICAgIA0KICAgIA0KICAgIC8vIFJlc2V0IHRoZSBjb250cm9sbGVyDQogICAgQURDX1NvZnRSZXNldChwQWRjKTsNCg0KICAgIC8vIFdyaXRlIHRvIHRoZSBNUiByZWdpc3Rlcg0KICAgIEFEQ19DZmdNb2RlUmVnKCBwQWRjLA0KICAgICAgICAgICAgICAgICAgICAoIHRyZ0VuICYgQVQ5MUNfQURDX1RSR0VOKQ0KICAgICAgICAgICAgICAgICAgfCAoIHRyZ1NlbCAmIEFUOTFDX0FEQ19UUkdTRUwpDQogICAgICAgICAgICAgICAgICB8ICggcmVzb2x1dGlvbiAmIEFUOTFDX0FEQ19MT1dSRVMpICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICB8ICggc2xlZXBNb2RlICYgQVQ5MUNfQURDX1NMRUVQKQ0KICAgICAgICAgICAgICAgICAgfCAoIChwcmVzY2FsPDw4KSAmIEFUOTFDX0FEQ19QUkVTQ0FMKSANCiAgICAgICAgICAgICAgICAgIHwgKCAoc3RhcnR1cDw8MTYpICYgQVQ5MUNfQURDX1NUQVJUVVApIA0KICAgICAgICAgICAgICAgICAgfCAoIChzaHRpbTw8MjQpICYgQVQ5MUNfQURDX1NIVElNKSApOw0KfQ0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLy8gUmV0dXJuIHRoZSBNb2RlIFJlZ2lzdGVyIG9mIHRoZSBBREMgY29udHJvbGxlciB2YWx1ZQ0KLy8vIFxwYXJhbSBwQWRjIFBvaW50ZXIgdG8gYW4gQVQ5MVNfQURDIGluc3RhbmNlLg0KLy8vIFxyZXR1cm4gQURDIE1vZGUgcmVnaXN0ZXINCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KLy9yZXBsYWNlZCB3aXRoIG1hY3JvIGRlZmluaXRpb24gaW4gYWRjLmgNCg0KLy91bnNpZ25lZCBpbnQgQURDX0dldE1vZGVSZWcoQVQ5MVNfQURDICpwQWRjKQ0KLy97DQovLyAgICByZXR1cm4gcEFkYy0+QURDX01SOyAgICANCi8vfQ0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLy8gRW5hYmxlIENoYW5uZWwNCi8vLyBccGFyYW0gcEFkYyBQb2ludGVyIHRvIGFuIEFUOTFTX0FEQyBpbnN0YW5jZS4NCi8vLyBccGFyYW0gY2hhbm5lbCBjaGFubmVsIHRvIGVuYWJsZQ0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy92b2lkIEFEQ19FbmFibGVDaGFubmVsKEFUOTFTX0FEQyAqcEFkYywgdW5zaWduZWQgaW50IGNoYW5uZWwpDQovL3sNCi8vICAgIEFTU0VSVChjaGFubmVsIDwgOCwgIkFEQyBDaGFubmVsIG5vdCBleGlzdCIpOw0KLy8NCi8vICAgIC8vIFdyaXRlIHRvIHRoZSBDSEVSIHJlZ2lzdGVyDQovLyAgICBwQWRjLT5BRENfQ0hFUiA9ICgxIDw8IGNoYW5uZWwpOw0KLy99DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vLyBEaXNhYmxlIENoYW5uZWwNCi8vLyBccGFyYW0gcEFkYyBQb2ludGVyIHRvIGFuIEFUOTFTX0FEQyBpbnN0YW5jZS4NCi8vLyBccGFyYW0gY2hhbm5lbCBjaGFubmVsIHRvIGRpc2FibGUNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vdm9pZCBBRENfRGlzYWJsZUNoYW5uZWwgKEFUOTFTX0FEQyAqcEFkYywgdW5zaWduZWQgaW50IGNoYW5uZWwpDQovL3sNCi8vICAgIEFTU0VSVChjaGFubmVsIDwgOCwgIkFEQyBDaGFubmVsIG5vdCBleGlzdCIpOw0KLy8NCi8vICAgIC8vIFdyaXRlIHRvIHRoZSBDSERSIHJlZ2lzdGVyDQovLyAgICBwQWRjLT5BRENfQ0hEUiA9ICgxIDw8IGNoYW5uZWwpOw0KLy99DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vLyBSZXR1cm4gY2hhbmVsIHN0YXR1cw0KLy8vIFxwYXJhbSBwQWRjIFBvaW50ZXIgdG8gYW4gQVQ5MVNfQURDIGluc3RhbmNlLg0KLy8vIFxyZXR1cm4gQURDIENoYW5uZWwgU3RhdHVzIFJlZ2lzdGVyDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovL3Vuc2lnbmVkIGludCBBRENfR2V0Q2hhbm5lbFN0YXR1cyhBVDkxU19BREMgKnBBZGMpDQovL3sNCi8vICAgIHJldHVybiBwQWRjLT5BRENfQ0hTUjsgICAgDQovL30NCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8vIFNvZnR3YXJlIHJlcXVlc3QgZm9yIGEgYW5hbG9nIHRvIGRpZ2l0YWwgY29udmVyc2lvbiANCi8vLyBccGFyYW0gcEFkYyBQb2ludGVyIHRvIGFuIEFUOTFTX0FEQyBpbnN0YW5jZS4NCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vdm9pZCBBRENfU3RhcnRDb252ZXJzaW9uKEFUOTFTX0FEQyAqcEFkYykNCi8vew0KLy8gICAgcEFkYy0+QURDX0NSID0gQVQ5MUNfQURDX1NUQVJUOyAgICANCi8vfQ0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLy8gU29mdHdhcmUgcmVzZXQNCi8vLyBccGFyYW0gcEFkYyBQb2ludGVyIHRvIGFuIEFUOTFTX0FEQyBpbnN0YW5jZS4NCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vdm9pZCBBRENfU29mdFJlc2V0KEFUOTFTX0FEQyAqcEFkYykNCi8vew0KLy8gICAgcEFkYy0+QURDX0NSID0gQVQ5MUNfQURDX1NXUlNUOyAgICANCi8vfQ0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLy8gUmV0dXJuIHRoZSBMYXN0IENvbnZlcnRlZCBEYXRhDQovLy8gXHBhcmFtIHBBZGMgUG9pbnRlciB0byBhbiBBVDkxU19BREMgaW5zdGFuY2UuDQovLy8gXHJldHVybiBMYXN0IENvbnZlcnRlZCBEYXRhDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovL3Vuc2lnbmVkIGludCBBRENfR2V0TGFzdENvbnZlcnRlZERhdGEoQVQ5MVNfQURDICpwQWRjKQ0KLy97DQovLyAgICByZXR1cm4gcEFkYy0+QURDX0xDRFI7ICAgIA0KLy99DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vLyBSZXR1cm4gdGhlIENoYW5uZWwgQ29udmVydGVkIERhdGENCi8vLyBccGFyYW0gcEFkYyBQb2ludGVyIHRvIGFuIEFUOTFTX0FEQyBpbnN0YW5jZS4NCi8vLyBccGFyYW0gY2hhbm5lbCBjaGFubmVsIHRvIGdldCBjb252ZXJ0ZWQgdmFsdWUNCi8vLyBccmV0dXJuIENoYW5uZWwgY29udmVydGVkIGRhdGEgb2YgdGhlIHNwZWNpZmllZCBjaGFubmVsDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQp1bnNpZ25lZCBpbnQgQURDX0dldENvbnZlcnRlZERhdGEoQVQ5MVNfQURDICpwQWRjLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkNCnsNCiAgICB1bnNpZ25lZCBpbnQgZGF0YT0wOw0KICAgIA0KICAgIEFTU0VSVChjaGFubmVsIDwgOCwgIkFEQyBjaGFubmVsIG5vdCBleGlzdCIpOw0KICAgIA0KICAgIHN3aXRjaChjaGFubmVsKSB7DQogICAgICAgIGNhc2UgMDogZGF0YSA9IHBBZGMtPkFEQ19DRFIwOyBicmVhazsNCiAgICAgICAgY2FzZSAxOiBkYXRhID0gcEFkYy0+QURDX0NEUjE7IGJyZWFrOw0KICAgICAgICBjYXNlIDI6IGRhdGEgPSBwQWRjLT5BRENfQ0RSMjsgYnJlYWs7DQogICAgICAgIGNhc2UgMzogZGF0YSA9IHBBZGMtPkFEQ19DRFIzOyBicmVhazsNCiAgICAgICAgI2lmZGVmIEFUOTFDX0FEQ19DRFI0DQogICAgICAgIGNhc2UgNDogZGF0YSA9IHBBZGMtPkFEQ19DRFI0OyBicmVhazsNCiAgICAgICAgI2VuZGlmDQogICAgICAgICNpZmRlZiBBVDkxQ19BRENfQ0RSNQ0KICAgICAgICBjYXNlIDU6IGRhdGEgPSBwQWRjLT5BRENfQ0RSNTsgYnJlYWs7DQogICAgICAgICNlbmRpZg0KICAgICAgICAjaWZkZWYgQVQ5MUNfQURDX0NEUjYNCiAgICAgICAgY2FzZSA2OiBkYXRhID0gcEFkYy0+QURDX0NEUjY7IGJyZWFrOw0KICAgICAgICAjZW5kaWYNCiAgICAgICAgI2lmZGVmIEFUOTFDX0FEQ19DRFI3DQogICAgICAgIGNhc2UgNzogZGF0YSA9IHBBZGMtPkFEQ19DRFI3OyBicmVhazsgICAgDQogICAgICAgICNlbmRpZg0KICAgIH0NCiAgICByZXR1cm4gZGF0YTsgICAgDQp9DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vLyBFbmFibGUgQURDIGludGVycnVwdA0KLy8vIFxwYXJhbSBwQWRjIFBvaW50ZXIgdG8gYW4gQVQ5MVNfQURDIGluc3RhbmNlLg0KLy8vIFxwYXJhbSBmbGFnIElUIHRvIGJlIGVuYWJsZWQNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vdm9pZCBBRENfRW5hYmxlSXQoQVQ5MVNfQURDICpwQWRjLCB1bnNpZ25lZCBpbnQgZmxhZykNCi8vew0KLy8gICAgQVNTRVJUKChmbGFnJjB4RkZGMDAwMDApPT0gMCwgIkFEQyBiYWQgaW50ZXJydXB0IElFUiIpOw0KLy8NCi8vICAgIC8vIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXINCi8vICAgIHBBZGMtPkFEQ19JRVIgPSBmbGFnOw0KLy99DQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vLyBFbmFibGUgQURDIERhdGEgUmVhZHkgaW50ZXJydXB0DQovLy8gXHBhcmFtIHBBZGMgUG9pbnRlciB0byBhbiBBVDkxU19BREMgaW5zdGFuY2UuDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCi8vdm9pZCBBRENfRW5hYmxlRGF0YVJlYWR5SXQoQVQ5MVNfQURDICpwQWRjKQ0KLy97DQovLyAgICBwQWRjLT5BRENfSUVSID0gQVQ5MUNfQURDX0RSRFk7DQovL30NCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8vIERpc2FibGUgQURDIGludGVycnVwdA0KLy8vIFxwYXJhbSBwQWRjIFBvaW50ZXIgdG8gYW4gQVQ5MVNfQURDIGluc3RhbmNlLg0KLy8vIFxwYXJhbSBmbGFnIElUIHRvIGJlIGRpc2FibGVkDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovL3ZvaWQgQURDX0Rpc2FibGVJdChBVDkxU19BREMgKnBBZGMsIHVuc2lnbmVkIGludCBmbGFnKQ0KLy97DQovLyAgICBBU1NFUlQoKGZsYWcmMHhGRkYwMDAwMCk9PSAwLCAiQURDIGJhZCBpbnRlcnJ1cHQgSURSIik7DQovLw0KLy8gICAgLy8gV3JpdGUgdG8gdGhlIElEUiByZWdpc3Rlcg0KLy8gICAgcEFkYy0+QURDX0lEUiA9IGZsYWc7DQovL30NCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8vIFJldHVybiBBREMgSW50ZXJydXB0IFN0YXR1cw0KLy8vIFxwYXJhbSBwQWRjIFBvaW50ZXIgdG8gYW4gQVQ5MVNfQURDIGluc3RhbmNlLg0KLy8vIFxyZXR1cm4gQURDIFN0YXRzIHJlZ2lzdGVyDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovL3Vuc2lnbmVkIGludCBBRENfR2V0U3RhdHVzKEFUOTFTX0FEQyAqcEFkYykNCi8vew0KLy8gICAgcmV0dXJuIHBBZGMtPkFEQ19TUjsNCi8vfQ0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLy8gUmV0dXJuIEFEQyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMNCi8vLyBccGFyYW0gcEFkYyBQb2ludGVyIHRvIGFuIEFUOTFTX0FEQyBpbnN0YW5jZS4NCi8vLyBccmV0dXJuIEFEQyBJbnRlcnJ1cHQgTWFzayBSZWdpc3Rlcg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy91bnNpZ25lZCBpbnQgQURDX0dldEludGVycnVwdE1hc2tTdGF0dXMoQVQ5MVNfQURDICpwQWRjKQ0KLy97DQovLyAgICByZXR1cm4gcEFkYy0+QURDX0lNUjsNCi8vfQ0KDQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLy8gVGVzdCBpZiBBREMgSW50ZXJydXB0IGlzIE1hc2tlZCANCi8vLyBccGFyYW0gcEFkYyBQb2ludGVyIHRvIGFuIEFUOTFTX0FEQyBpbnN0YW5jZS4NCi8vLyBccGFyYW0gZmxhZyBmbGFnIHRvIGJlIHRlc3RlZA0KLy8vIFxyZXR1cm4gMSBpZiBpbnRlcnJ1cHQgaXMgbWFza2VkLCBvdGhlcndpc2UgMA0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KdW5zaWduZWQgaW50IEFEQ19Jc0ludGVycnVwdE1hc2tlZChBVDkxU19BREMgKnBBZGMsIHVuc2lnbmVkIGludCBmbGFnKQ0Kew0KICAgIHJldHVybiAoQURDX0dldEludGVycnVwdE1hc2tTdGF0dXMocEFkYykgJiBmbGFnKTsNCn0NCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8vIFRlc3QgaWYgQURDIFN0YXR1cyBpcyBTZXQNCi8vLyBccGFyYW0gcEFkYyBQb2ludGVyIHRvIGFuIEFUOTFTX0FEQyBpbnN0YW5jZS4NCi8vLyBccGFyYW0gZmxhZyBmbGFnIHRvIGJlIHRlc3RlZA0KLy8vIFxyZXR1cm4gMSBpZiB0aGUgc3RhdXMgaXMgc2V0OyAwIG90aGVyd2lzZQ0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KdW5zaWduZWQgaW50IEFEQ19Jc1N0YXR1c1NldChBVDkxU19BREMgKnBBZGMsIHVuc2lnbmVkIGludCBmbGFnKQ0Kew0KICAgIHJldHVybiAoQURDX0dldFN0YXR1cyhwQWRjKSAmIGZsYWcpOw0KfQ0KDQoNCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vLyBUZXN0IGlmIEFEQyBjaGFubmVsIGludGVycnVwdCBTdGF0dXMgaXMgU2V0DQovLy8gXHBhcmFtIGFkY19zciBWYWx1ZSBvZiBTUiByZWdpc3Rlcg0KLy8vIFxwYXJhbSBjaGFubmVsIENoYW5uZWwgdG8gYmUgdGVzdGVkDQovLy8gXHJldHVybiAxIGlmIGludGVycnVwdCBzdGF0dXMgaXMgc2V0LCBvdGhlcndpc2UgMA0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KdW5zaWduZWQgY2hhciBBRENfSXNDaGFubmVsSW50ZXJydXB0U3RhdHVzU2V0KHVuc2lnbmVkIGludCBhZGNfc3IsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjaGFubmVsKQ0Kew0KICAgIHVuc2lnbmVkIGNoYXIgc3RhdHVzOw0KICAgIA0KICAgIGlmKChhZGNfc3IgJiAoMTw8Y2hhbm5lbCkpID09ICgxPDxjaGFubmVsKSkgew0KICAgICAgICBzdGF0dXMgPSAxOw0KICAgIH0NCiAgICBlbHNlIHsNCiAgICAgICAgc3RhdHVzID0gMDsNCiAgICB9DQogICAgcmV0dXJuIHN0YXR1czsNCn0NCg0KDQoNCg0K