LyoKICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQogKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwogKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCiAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCiAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCiAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgTW9kdWxlIE5hbWUgOiBtbS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGNvbW1vbiBmdW5jdGlvbnMgZm9yIGhhbmRsZSBtYW5hZ2VtZW50ICAgICAqLwovKiAgICAgIGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaW5jbHVkZSAiY3ByZWNvbXAuaCIKI2luY2x1ZGUgIi4uL2hhbC9ocHJlZy5oIgoKLyogVE9ETyA6IHB1dCBhbGwgY29uc3RhbnQgdGFibGVzIHRvIGEgZmlsZSAqLwpjb25zdCB1OF90IHpnMTFiUmF0ZVRibFs0XSA9IHsyLCA0LCAxMSwgMjJ9Owpjb25zdCB1OF90IHpnMTFnUmF0ZVRibFs4XSA9IHsxMiwgMTgsIDI0LCAzNiwgNDgsIDcyLCA5NiwgMTA4fTsKCi8qIDB4ZmYgPT4gZWxlbWVudCBkb2VzIG5vdCBleGlzdCAqLwpjb25zdCB1OF90IHpnRWxlbWVudE9mZnNldFRhYmxlW10gPQp7CiAgICA0LCAgICAgIC8qICAwIDogYXNvYyByZXEgKi8KICAgIDYsICAgICAgLyogIDEgOiBhc29jIHJzcCAqLwogICAgMTAsICAgICAvKiAgMiA6IHJlYXNvYyByZXEqLwogICAgNiwgICAgICAvKiAgMyA6IHJlYXNvYyByc3AgKi8KICAgIDAsICAgICAgLyogIDQgOiBwcm9iZSByZXEgKi8KICAgIDEyLCAgICAgLyogIDUgOiBwcm9iZSByc3AgKi8KICAgIDB4ZmYsICAgLyogIDYgOiByZXNlcnZlZCAqLwogICAgMHhmZiwgICAvKiAgNyA6IHJlc2VydmVkICovCiAgICAxMiwgICAgIC8qICA4IDogYmVhY29uICovCiAgICA0LCAgICAgIC8qICA5IDogQVRJTSAqLwogICAgMHhmZiwgICAvKiAxMCA6IGRpc2Fzb2MgKi8KICAgIDYsICAgICAgLyogMTEgOiBhdXRoICovCiAgICAweGZmLCAgIC8qIDEyIDogZGVhdXRoICovCiAgICA0LCAgICAgIC8qIDEzIDogYWN0aW9uICovCiAgICAweGZmLCAgIC8qIDE0IDogcmVzZXJ2ZWQgKi8KICAgIDB4ZmYsICAgLyogMTUgOiByZXNlcnZlZCAqLwp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkZpbmRFbGVtZW50ICAgICAgICAgICAgICAgKi8KLyogICAgICBGaW5kIGEgc3BlY2lmaWMgZWxlbWVudCBpbiBtYW5hZ2VtZW50IGZyYW1lICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBidWYgOiBtYW5hZ2VtZW50IGZyYW1lIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBlaWQgOiB0YXJnZXQgZWxlbWVudCBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBieXRlIG9mZnNldCBvZiB0YXJnZXQgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBvciAweGZmZmYgaWYgbm90IGZvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNS4xMCAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdTE2X3QgemZGaW5kRWxlbWVudCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QgZWlkKQp7CiAgICB1OF90IHN1YlR5cGU7CiAgICB1MTZfdCBvZmZzZXQ7CiAgICB1MTZfdCBidWZMZW47CiAgICB1MTZfdCBlbGVuOwogICAgdThfdCBpZCwgSFRFaWQ9MDsKICAgIHU4X3Qgb3VpWzRdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDF9OwogICAgdThfdCBvdWkxMW5bM10gPSB7MHgwMCwweDkwLDB4NEN9OwogICAgdThfdCBIVFR5cGUgPSAwOwoKICAgIC8qIEdldCBvZmZzZXQgb2YgZmlyc3QgZWxlbWVudCAqLwogICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKICAgIG9mZnNldCA9IHpnRWxlbWVudE9mZnNldFRhYmxlW3N1YlR5cGVdOwogICAgaWYgKG9mZnNldCA9PSAweGZmKQogICAgewogICAgICAgIHptX2Fzc2VydCgwKTsKICAgIH0KCiAgICAvKiBQbHVzIHdsYW4gaGVhZGVyICovCiAgICBvZmZzZXQgKz0gMjQ7CgogICAgLy8gamhsZWUgSFQgMAoKICAgIGlmICgoZWlkID09IFpNX1dMQU5fRUlEX0hUX0NBUEFCSUxJVFkpIHx8CiAgICAgICAgKGVpZCA9PSBaTV9XTEFOX0VJRF9FWFRFTkRFRF9IVF9DQVBBQklMSVRZKSkKICAgIHsKICAgICAgICBIVEVpZCA9IGVpZDsKICAgICAgICBlaWQgPSBaTV9XTEFOX0VJRF9XUEFfSUU7CiAgICAgICAgSFRUeXBlID0gMTsKICAgIH0KCgogICAgYnVmTGVuID0gemZ3QnVmR2V0U2l6ZShkZXYsIGJ1Zik7CiAgICAvKiBTZWFyY2ggbG9vcCAqLwogICAgd2hpbGUgKChvZmZzZXQrMik8YnVmTGVuKSAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgZWxlbWVudCBJRCBhbmQgbGVuZ3RoICgyYnl0ZXMpCiAgICB7CiAgICAgICAgLyogU2VhcmNoIHRhcmdldCBlbGVtZW50ICovCiAgICAgICAgaWQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpOwogICAgICAgIGlmIChpZCA9PSBlaWQpCiAgICAgICAgewogICAgICAgICAgICAvKiBCaW5nbyAqLwogICAgICAgICAgICBlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOwogICAgICAgICAgICBpZiAoZWxlbiA+IGJ1ZkxlbiAtIG9mZnNldCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggZWxlbiA9PSAwICYmIGVpZCAhPSBaTV9XTEFOX0VJRF9TU0lEKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGxlbmd0aCBlcnJvciAqLwogICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBlaWQgPT0gWk1fV0xBTl9FSURfV1BBX0lFICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogYXZvaWQgc3RhIHRvIGJlIHRob3VnaHQgdXNlIDExbiB3aGVuIGZpbmQgYSBXUEFfSUUgKi8KICAgICAgICAgICAgICAgIGlmICggKEhUVHlwZSA9PSAwKSAmJiB6ZlJ4QnVmZmVyRXF1YWxUb1N0cihkZXYsIGJ1Ziwgb3VpLCBvZmZzZXQrMiwgNCkgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gamhsZWUgSFQgMAogICAgICAgICAgICAgICAgLy8gQ1dZYW5nKCspCgogICAgICAgICAgICAgICAgaWYgKChIVFR5cGUgPT0gMSkgJiYgKCB6ZlJ4QnVmZmVyRXF1YWxUb1N0cihkZXYsIGJ1Ziwgb3VpMTFuLCBvZmZzZXQrMiwgMykgKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs1KSA9PSBIVEVpZCApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0ICsgNTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKiBBZHZhbmNlIHRvIG5leHQgZWxlbWVudCAqLwogICAgICAgICNpZiAxCiAgICAgICAgZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKICAgICAgICAjZWxzZQogICAgICAgIGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSk7CiAgICAgICAgaWYgKGVsZW4gPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAweGZmZmY7CiAgICAgICAgfQogICAgICAgICNlbmRpZgoKICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CiAgICB9CiAgICByZXR1cm4gMHhmZmZmOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZkZpbmRXaWZpRWxlbWVudCAgICAgICAgICAgKi8KLyogICAgICBGaW5kIGEgc3BlY2lmaWMgV2lmaSBlbGVtZW50IGluIG1hbmFnZW1lbnQgZnJhbWUgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBidWYgOiBtYW5hZ2VtZW50IGZyYW1lIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICB0eXBlIDogT1VJIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBzdWJUeXBlIDogT1VJIHN1YnR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBieXRlIG9mZnNldCBvZiB0YXJnZXQgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBvciAweGZmZmYgaWYgbm90IGZvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBTdGVwaGVuIENoZW4gICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi4xICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdTE2X3QgemZGaW5kV2lmaUVsZW1lbnQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90IHR5cGUsIHU4X3Qgc3VidHlwZSkKewogICAgdThfdCBzdWJUeXBlOwogICAgdTE2X3Qgb2Zmc2V0OwogICAgdTE2X3QgYnVmTGVuOwogICAgdTE2X3QgZWxlbjsKICAgIHU4X3QgaWQ7CiAgICB1OF90IHRtcDsKCiAgICAvKiBHZXQgb2Zmc2V0IG9mIGZpcnN0IGVsZW1lbnQgKi8KICAgIHN1YlR5cGUgPSAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCkgPj4gNCk7CgogICAgb2Zmc2V0ID0gemdFbGVtZW50T2Zmc2V0VGFibGVbc3ViVHlwZV07CiAgICBpZiAob2Zmc2V0ID09IDB4ZmYpCiAgICB7CiAgICAgICAgem1fYXNzZXJ0KDApOwogICAgfQoKICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KICAgIG9mZnNldCArPSAyNDsKCiAgICBidWZMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKICAgIC8qIFNlYXJjaCBsb29wICovCiAgICB3aGlsZSAoKG9mZnNldCsyKTxidWZMZW4pICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyBlbGVtZW50IElEIGFuZCBsZW5ndGggKDJieXRlcykKICAgIHsKICAgICAgICAvKiBTZWFyY2ggdGFyZ2V0IGVsZW1lbnQgKi8KICAgICAgICBpZCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCk7CiAgICAgICAgaWYgKGlkID09IFpNX1dMQU5fRUlEX1dJRklfSUUpCiAgICAgICAgewogICAgICAgICAgICAvKiBCaW5nbyAqLwogICAgICAgICAgICBlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOwogICAgICAgICAgICBpZiAoZWxlbiA+IGJ1ZkxlbiAtIG9mZnNldCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggZWxlbiA9PSAwICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpKSA9PSAweDAwKQogICAgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzMpKSA9PSAweDUwKQogICAgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzQpKSA9PSAweEYyKQogICAgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzUpKSA9PSB0eXBlKSkKCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICggc3VidHlwZSAhPSAweGZmICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBzdWJ0eXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKiBBZHZhbmNlIHRvIG5leHQgZWxlbWVudCAqLwogICAgICAgIGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSk7CiAgICAgICAgaWYgKGVsZW4gPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAweGZmZmY7CiAgICAgICAgfQogICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKICAgIH0KICAgIHJldHVybiAweGZmZmY7Cn0KCnUxNl90IHpmUmVtb3ZlRWxlbWVudCh6ZGV2X3QqIGRldiwgdThfdCogYnVmLCB1MTZfdCBzaXplLCB1OF90IGVpZCkKewogICAgdTE2X3Qgb2Zmc2V0ID0gMDsKICAgIHUxNl90IGVsZW47CiAgICB1OF90ICBIVEVpZCA9IDA7CiAgICB1OF90ICBvdWlbNF0gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMX07CiAgICB1OF90ICBvdWkxMW5bM10gPSB7MHgwMCwweDkwLDB4NEN9OwogICAgdThfdCAgSFRUeXBlID0gMDsKCiAgICBpZiAoKGVpZCA9PSBaTV9XTEFOX0VJRF9IVF9DQVBBQklMSVRZKSB8fAogICAgICAgIChlaWQgPT0gWk1fV0xBTl9FSURfRVhURU5ERURfSFRfQ0FQQUJJTElUWSkpCiAgICB7CiAgICAgICAgSFRFaWQgPSBlaWQ7CiAgICAgICAgZWlkID0gWk1fV0xBTl9FSURfV1BBX0lFOwogICAgICAgIEhUVHlwZSA9IDE7CiAgICB9CgogICAgd2hpbGUgKG9mZnNldCA8IHNpemUpCiAgICB7CiAgICAgICAgZWxlbiA9ICooYnVmK29mZnNldCsxKTsKCiAgICAgICAgaWYgKCooYnVmK29mZnNldCkgPT0gZWlkKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCBlaWQgPT0gWk1fV0xBTl9FSURfV1BBX0lFICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCAoSFRUeXBlID09IDApCiAgICAgICAgICAgICAgICAgICAgICYmICgqKGJ1ZitvZmZzZXQrMikgPT0gb3VpWzBdKQogICAgICAgICAgICAgICAgICAgICAmJiAoKihidWYrb2Zmc2V0KzMpID09IG91aVsxXSkKICAgICAgICAgICAgICAgICAgICAgJiYgKCooYnVmK29mZnNldCs0KSA9PSBvdWlbMl0pCiAgICAgICAgICAgICAgICAgICAgICYmICgqKGJ1ZitvZmZzZXQrNSkgPT0gb3VpWzNdKSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgemZNZW1vcnlNb3ZlKGJ1ZitvZmZzZXQsIGJ1ZitvZmZzZXQrZWxlbisyLCBzaXplLW9mZnNldC1lbGVuLTIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAoc2l6ZS1lbGVuLTIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggKEhUVHlwZSA9PSAxKQogICAgICAgICAgICAgICAgICAgICYmICgqKGJ1ZitvZmZzZXQrMikgPT0gb3VpMTFuWzBdKQogICAgICAgICAgICAgICAgICAgICYmICgqKGJ1ZitvZmZzZXQrMykgPT0gb3VpMTFuWzFdKQogICAgICAgICAgICAgICAgICAgICYmICgqKGJ1ZitvZmZzZXQrNCkgPT0gb3VpMTFuWzJdKQogICAgICAgICAgICAgICAgICAgICYmICgqKGJ1ZitvZmZzZXQrNSkgPT0gSFRFaWQpICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB6Zk1lbW9yeU1vdmUoYnVmK29mZnNldCwgYnVmK29mZnNldCtlbGVuKzIsIHNpemUtb2Zmc2V0LWVsZW4tMik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChzaXplLWVsZW4tMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB6Zk1lbW9yeU1vdmUoYnVmK29mZnNldCwgYnVmK29mZnNldCtlbGVuKzIsIHNpemUtb2Zmc2V0LWVsZW4tMik7CiAgICAgICAgICAgICAgICByZXR1cm4gKHNpemUtZWxlbi0yKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgb2Zmc2V0ICs9IChlbGVuKzIpOwogICAgfQoKICAgIHJldHVybiBzaXplOwp9Cgp1MTZfdCB6ZlVwZGF0ZUVsZW1lbnQoemRldl90KiBkZXYsIHU4X3QqIGJ1ZiwgdTE2X3Qgc2l6ZSwgdThfdCogdXBkYXRlZWlkKQp7CiAgICB1MTZfdCBvZmZzZXQgPSAwOwogICAgdTE2X3QgZWxlbjsKCiAgICB3aGlsZSAob2Zmc2V0IDwgc2l6ZSkgewogICAgICAgIGVsZW4gPSAqKGJ1ZitvZmZzZXQrMSk7CgogICAgICAgIGlmICgqKGJ1ZitvZmZzZXQpID09IHVwZGF0ZWVpZFswXSkgewogICAgICAgICAgICBpZiAodXBkYXRlZWlkWzFdIDw9IGVsZW4pIHsKICAgICAgICAgICAgICAgIHpmTWVtb3J5TW92ZShidWYrb2Zmc2V0LCB1cGRhdGVlaWQsIHVwZGF0ZWVpZFsxXSsyKTsKICAgICAgICAgICAgICAgIHpmTWVtb3J5TW92ZShidWYrb2Zmc2V0K3VwZGF0ZWVpZFsxXSsyLCBidWYrb2Zmc2V0K2VsZW4rMiwgc2l6ZS1vZmZzZXQtZWxlbi0yKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZS0oZWxlbi11cGRhdGVlaWRbMV0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgemZNZW1vcnlNb3ZlKGJ1ZitvZmZzZXQrdXBkYXRlZWlkWzFdKzIsIGJ1ZitvZmZzZXQrZWxlbisyLCBzaXplLW9mZnNldC1lbGVuLTIpOwogICAgICAgICAgICAgICAgemZNZW1vcnlNb3ZlKGJ1ZitvZmZzZXQsIHVwZGF0ZWVpZCwgdXBkYXRlZWlkWzFdKzIpOwoKICAgICAgICAgICAgICAgIHJldHVybiBzaXplKyh1cGRhdGVlaWRbMV0tZWxlbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKICAgIH0KCiAgICByZXR1cm4gc2l6ZTsKfQoKdTE2X3QgemZGaW5kU3VwZXJHRWxlbWVudCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHU4X3QgdHlwZSkKewogICAgdThfdCBzdWJUeXBlOwogICAgdTE2X3Qgb2Zmc2V0OwogICAgdTE2X3QgYnVmTGVuOwogICAgdTE2X3QgZWxlbjsKICAgIHU4X3QgaWQ7CiAgICB1OF90IHN1cGVyX2ZlYXR1cmU7CiAgICB1OF90IG91aVN1cGVyR1s2XSA9IHsweDAwLDB4MDMsMHg3ZiwweDAxLCAweDAxLCAweDAwfTsKCiAgICAvKiBHZXQgb2Zmc2V0IG9mIGZpcnN0IGVsZW1lbnQgKi8KICAgIHN1YlR5cGUgPSAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCkgPj4gNCk7CiAgICBvZmZzZXQgPSB6Z0VsZW1lbnRPZmZzZXRUYWJsZVtzdWJUeXBlXTsKICAgIGlmIChvZmZzZXQgPT0gMHhmZikKICAgIHsKICAgICAgICB6bV9hc3NlcnQoMCk7CiAgICB9CgogICAgLyogUGx1cyB3bGFuIGhlYWRlciAqLwogICAgb2Zmc2V0ICs9IDI0OwoKICAgIGJ1ZkxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOwogICAgLyogU2VhcmNoIGxvb3AgKi8KICAgIHdoaWxlICgob2Zmc2V0KzIpPGJ1ZkxlbikgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGVsZW1lbnQgSUQgYW5kIGxlbmd0aCAoMmJ5dGVzKQogICAgewogICAgICAgIC8qIFNlYXJjaCB0YXJnZXQgZWxlbWVudCAqLwogICAgICAgIGlkID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KTsKICAgICAgICBpZiAoaWQgPT0gWk1fV0xBTl9FSURfVkVORE9SX1BSSVZBVEUpCiAgICAgICAgewogICAgICAgICAgICAvKiBCaW5nbyAqLwogICAgICAgICAgICBlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOwogICAgICAgICAgICBpZiAoZWxlbiA+IGJ1ZkxlbiAtIG9mZnNldCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggZWxlbiA9PSAwICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCBvdWlTdXBlckcsIG9mZnNldCsyLCA2KSAmJiAoIHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKSA+PSA2KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogc3VwZXJfZmVhdHVyZSAwOnVzZUZhc3RGcmFtZSwgMTp1c2VDb21wcmVzc2lvbiwgMjp1c2VUdXJib1ByaW1lICovCiAgICAgICAgICAgICAgICBzdXBlcl9mZWF0dXJlPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrOCk7CiAgICAgICAgICAgICAgICBpZiAoKHN1cGVyX2ZlYXR1cmUgJiAweDAxKSB8fCAoc3VwZXJfZmVhdHVyZSAmIDB4MDIpIHx8IChzdXBlcl9mZWF0dXJlICYgMHgwNCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKiBBZHZhbmNlIHRvIG5leHQgZWxlbWVudCAqLwogICAgICAgICNpZiAxCiAgICAgICAgZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKICAgICAgICAjZWxzZQogICAgICAgIGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSk7CiAgICAgICAgaWYgKGVsZW4gPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAweGZmZmY7CiAgICAgICAgfQogICAgICAgICNlbmRpZgoKICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CiAgICB9CiAgICByZXR1cm4gMHhmZmZmOwp9Cgp1MTZfdCB6ZkZpbmRYUkVsZW1lbnQoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90IHR5cGUpCnsKICAgIHU4X3Qgc3ViVHlwZTsKICAgIHUxNl90IG9mZnNldDsKICAgIHUxNl90IGJ1ZkxlbjsKICAgIHUxNl90IGVsZW47CiAgICB1OF90IGlkOwogICAgdThfdCBvdWl4cls2XSA9IHsweDAwLDB4MDMsMHg3ZiwweDAzLCAweDAxLCAweDAwfTsKCiAgICAvKiBHZXQgb2Zmc2V0IG9mIGZpcnN0IGVsZW1lbnQgKi8KICAgIHN1YlR5cGUgPSAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCkgPj4gNCk7CiAgICBvZmZzZXQgPSB6Z0VsZW1lbnRPZmZzZXRUYWJsZVtzdWJUeXBlXTsKICAgIGlmIChvZmZzZXQgPT0gMHhmZikKICAgIHsKICAgICAgICB6bV9hc3NlcnQoMCk7CiAgICB9CgogICAgLyogUGx1cyB3bGFuIGhlYWRlciAqLwogICAgb2Zmc2V0ICs9IDI0OwoKICAgIGJ1ZkxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOwogICAgLyogU2VhcmNoIGxvb3AgKi8KICAgIHdoaWxlICgob2Zmc2V0KzIpPGJ1ZkxlbikgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGVsZW1lbnQgSUQgYW5kIGxlbmd0aCAoMmJ5dGVzKQogICAgewogICAgICAgIC8qIFNlYXJjaCB0YXJnZXQgZWxlbWVudCAqLwogICAgICAgIGlkID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KTsKICAgICAgICBpZiAoaWQgPT0gWk1fV0xBTl9FSURfVkVORE9SX1BSSVZBVEUpCiAgICAgICAgewogICAgICAgICAgICAvKiBCaW5nbyAqLwogICAgICAgICAgICBlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOwogICAgICAgICAgICBpZiAoZWxlbiA+IGJ1ZkxlbiAtIG9mZnNldCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggZWxlbiA9PSAwICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHpmUnhCdWZmZXJFcXVhbFRvU3RyKGRldiwgYnVmLCBvdWl4ciwgb2Zmc2V0KzIsIDYpICYmICggem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpID49IDYpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qIEFkdmFuY2UgdG8gbmV4dCBlbGVtZW50ICovCiAgICAgICAgI2lmIDEKICAgICAgICBlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOwogICAgICAgICNlbHNlCiAgICAgICAgZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKICAgICAgICBpZiAoZWxlbiA9PSAwKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKICAgICAgICB9CiAgICAgICAgI2VuZGlmCgogICAgICAgIG9mZnNldCArPSAoZWxlbisyKTsKICAgIH0KICAgIHJldHVybiAweGZmZmY7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZNbUFkZEllU3VwcG9ydFJhdGUgICAgICAgICovCi8qICAgICAgQWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgU3VwcG9ydCBSYXRlIHRvIGJ1ZmZlci4gICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgYnVmIDogYnVmZmVyIHRvIGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgb2Zmc2V0IDogYWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgZnJvbSB0aGlzIG9mZnNldCAgICAgICAgICAgICAgICovCi8qICAgICAgZWlkIDogZWxlbWVudCBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgcmF0ZVNldCA6ICBDQ0sgb3IgT0ZETSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgYnVmZmVyIG9mZnNldCBhZnRlciBhZGRpbmcgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnUxNl90IHpmTW1BZGRJZVN1cHBvcnRSYXRlKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0LCB1OF90IGVpZCwgdThfdCByYXRlU2V0KQp7CiAgICB1OF90IGxlbiA9IDA7CiAgICB1MTZfdCBpOwoKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKCiAgICAvL2lmICggKHJhdGVTZXQgPT0gWk1fUkFURV9TRVRfT0ZETSkmJigod2QtPmdSYXRlICYgMHhmZikgPT0gMCkgKQogICAgLy97CiAgICAvLyAgICByZXR1cm4gb2Zmc2V0OwogICAgLy99CgogICAgLyogSW5mb3JtYXRpb24gOiBTdXBwb3J0IFJhdGUgKi8KICAgIGlmICggcmF0ZVNldCA9PSBaTV9SQVRFX1NFVF9DQ0sgKQogICAgewogICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGlmICgod2QtPmJSYXRlICYgKDB4MTw8aSkpID09ICgweDE8PGkpKQogICAgICAgICAgICAvL2lmICgoMHhmICYgKDB4MTw8aSkpID09ICgweDE8PGkpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0K2xlbisyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemcxMWJSYXRlVGJsW2ldKygod2QtPmJSYXRlQmFzaWMgJiAoMHgxPDxpKSk8PCg3LWkpKSk7CiAgICAgICAgICAgICAgICBsZW4rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKCByYXRlU2V0ID09IFpNX1JBVEVfU0VUX09GRE0gKQogICAgewogICAgICAgIGZvciAoaT0wOyBpPDg7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGlmICgod2QtPmdSYXRlICYgKDB4MTw8aSkpID09ICgweDE8PGkpKQogICAgICAgICAgICAvL2lmICgoMHhmZiAmICgweDE8PGkpKSA9PSAoMHgxPDxpKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCtsZW4rMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpnMTFnUmF0ZVRibFtpXSsoKHdkLT5nUmF0ZUJhc2ljICYgKDB4MTw8aSkpPDwoNy1pKSkpOwogICAgICAgICAgICAgICAgbGVuKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKGxlbiA+IDApCiAgICB7CiAgICAgICAgLyogRWxlbWVudCBJRCAqLwogICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQsIGVpZCk7CgogICAgICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCiAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsxLCBsZW4pOwoKICAgICAgICAvKiBSZXR1cm4gdmFsdWUgKi8KICAgICAgICBvZmZzZXQgKz0gKDIrbGVuKTsKICAgIH0KCiAgICByZXR1cm4gb2Zmc2V0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTW1BZGRJZURzICAgICAgICAgICAgICAgICAqLwovKiAgICAgIEFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IERTIHRvIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGJ1ZiA6IGJ1ZmZlciB0byBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp1MTZfdCB6Zk1tQWRkSWVEcyh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKewogICAgem13X2dldF93bGFuX2RldihkZXYpOwoKICAgIC8qIEVsZW1lbnQgSUQgKi8KICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9FSURfRFMpOwoKICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCiAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIDEpOwoKICAgIC8qIEluZm9ybWF0aW9uIDogRFMgKi8KICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywKICAgICAgICAgICAgICAgICAgICAgICAgIHpmQ2hGcmVxVG9OdW0od2QtPmZyZXF1ZW5jeSwgTlVMTCkpOwoKICAgIHJldHVybiBvZmZzZXQ7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTW1BZGRJZUVycCAgICAgICAgICAgICAgICAqLwovKiAgICAgIEFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IEVSUCB0byBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGJ1ZiA6IGJ1ZmZlciB0byBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp1MTZfdCB6Zk1tQWRkSWVFcnAoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQpCnsKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKCiAgICAvKiBFbGVtZW50IElEICovCiAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX0VSUCk7CgogICAgLyogRWxlbWVudCBMZW5ndGggKi8KICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMSk7CgogICAgLyogSW5mb3JtYXRpb24gOiBFUlAgKi8KICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmVycEVsZW1lbnQpOwoKICAgIHJldHVybiBvZmZzZXQ7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmTW1BZGRJZVdwYSAgICAgICAgICAgICAgICAqLwovKiAgICAgIEFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IFdQQSB0byBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGJ1ZiA6IGJ1ZmZlciB0byBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIG9mZnNldCA6IGFkZCBpbmZvcm1hdGlvbiBlbGVtZW50IGZyb20gdGhpcyBvZmZzZXQgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGJ1ZmZlciBvZmZzZXQgYWZ0ZXIgYWRkaW5nIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIFl1YW4tR3UgV2VpICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjIgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp1MTZfdCB6Zk1tQWRkSWVXcGEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHUxNl90IGFwSWQpCnsKICAgIC8vc3RydWN0IHpzV2xhbkRldiogd2QgPSAoc3RydWN0IHpzV2xhbkRldiopIHptd193bGFuX2RldihkZXYpOwogICAgaW50IGk7CgogICAgem13X2dldF93bGFuX2RldihkZXYpOwoKICAgIC8qIEVsZW1lbnQgSUQgKi8KICAgIC8vem13X2ludHR4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX0VJRF9XUEFfSUUpOwoKICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCiAgICAvL3ptd19pbnR0eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLndwYUxlbik7CiAgICBmb3IoaSA9IDA7IGkgPCB3ZC0+YXAud3BhTGVuW2FwSWRdOyBpKyspCiAgICB7CiAgICAgICAgLyogSW5mb3JtYXRpb24gOiBXUEEgKi8KICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC53cGFJZVthcElkXVtpXSk7CiAgICB9CgogICAgcmV0dXJuIG9mZnNldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6Zk1tQWRkSFRDYXBhYmlsaXR5ICAgICAgICAgKi8KLyogICAgICBBZGQgSFQgQ2FwYWJpbGl0eSBJbmZvbWF0aW9uIHRvIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBidWYgOiBidWZmZXIgdG8gYWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBvZmZzZXQgOiBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCBmcm9tIHRoaXMgb2Zmc2V0ICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBidWZmZXIgb2Zmc2V0IGFmdGVyIGFkZGluZyBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBDaGFvLVdlbiBZYW5nICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgICAgIDIwMDYuMDYgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdTE2X3QgemZNbUFkZEhUQ2FwYWJpbGl0eSh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCkKewogICAgdThfdCBPVUlbM10gPSB7MHgwLDB4OTAsMHg0Q307CiAgICB1MTZfdCBpOwoKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKCiAgICAvKiBQcm9iIElEICovCiAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1dQQV9JRSk7CgogICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCApCiAgICB7CiAgICAgICAgLyogRWxlbWVudCBMZW5ndGggKi8KICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC5IVENhcC5EYXRhLkxlbmd0aCArIDQpOwoKICAgICAgICAvKiBPVUkgRGF0YSAqLwogICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIE9VSVtpXSk7CiAgICAgICAgfQoKICAgICAgICAvKiBFbGVtZW50IFR5cGUgSUQgKi8KICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC5IVENhcC5EYXRhLkVsZW1lbnRJRCk7CgogICAgICAgIC8qIEhUIENhcGFiaWxpdHkgRGF0YSAqLwogICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNjsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+YXAuSFRDYXAuQnl0ZVtpKzJdKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLyogRWxlbWVudCBMZW5ndGggKi8KICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuSFRDYXAuRGF0YS5MZW5ndGggKyA0KTsKCiAgICAgICAgLyogT1VJIERhdGEgKi8KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBPVUlbaV0pOwogICAgICAgIH0KCiAgICAgICAgLyogRWxlbWVudCBUeXBlIElEICovCiAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLkhUQ2FwLkRhdGEuRWxlbWVudElEKTsKCiAgICAgICAgLyogSFQgQ2FwYWJpbGl0eSBEYXRhICovCiAgICAgICAgZm9yIChpID0gMDsgaSA8IDI2OyBpKyspCiAgICAgICAgewogICAgICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuSFRDYXAuQnl0ZVtpKzJdKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIG9mZnNldDsKfQoKCnUxNl90IHpmTW1BZGRQcmVOSFRDYXBhYmlsaXR5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQp7CiAgICAvL3U4X3QgT1VJWzNdID0gezB4MCwweDkwLDB4NEN9OwogICAgdTE2X3QgaTsKCiAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CgogICAgLyogUHJvYiBJRCAqLwogICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCBaTV9XTEFOX1BSRU4yX0VJRF9IVENBUEFCSUxJVFkpOwoKICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgKQogICAgewogICAgICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCiAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+YXAuSFRDYXAuRGF0YS5MZW5ndGgpOwoKICAgICAgICAvKiBIVCBDYXBhYmlsaXR5IERhdGEgKi8KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjY7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkhUQ2FwLkJ5dGVbaSsyXSk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIC8qIEVsZW1lbnQgTGVuZ3RoICovCiAgICAgICAgem13X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLkhUQ2FwLkRhdGEuTGVuZ3RoKTsKCiAgICAgICAgLyogSFQgQ2FwYWJpbGl0eSBEYXRhICovCiAgICAgICAgZm9yIChpID0gMDsgaSA8IDI2OyBpKyspCiAgICAgICAgewogICAgICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuSFRDYXAuQnl0ZVtpKzJdKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIG9mZnNldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgemZNbUFkZEV4dGVuZGVkSFRDYXBhYmlsaXR5ICAgKi8KLyogICAgICBBZGQgRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0eSBJbmZvbWF0aW9uIHRvIGJ1ZmZlci4gICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBidWYgOiBidWZmZXIgdG8gYWRkIGluZm9ybWF0aW9uIGVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBvZmZzZXQgOiBhZGQgaW5mb3JtYXRpb24gZWxlbWVudCBmcm9tIHRoaXMgb2Zmc2V0ICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBidWZmZXIgb2Zmc2V0IGFmdGVyIGFkZGluZyBpbmZvcm1hdGlvbiBlbGVtZW50ICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBDaGFvLVdlbiBZYW5nICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgICAgIDIwMDYuMDYgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdTE2X3QgemZNbUFkZEV4dGVuZGVkSFRDYXBhYmlsaXR5KHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3Qgb2Zmc2V0KQp7CiAgICB1OF90IE9VSVszXSA9IHsweDAsMHg5MCwweDRDfTsKICAgIHUxNl90IGk7CgogICAgem13X2dldF93bGFuX2RldihkZXYpOwoKICAgIC8qIFByb2IgSUQgKi8KICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9FSURfV1BBX0lFKTsKCiAgICBpZiAoIHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQICkKICAgIHsKICAgICAgICAvKiBFbGVtZW50IExlbmd0aCAqLwogICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkV4dEhUQ2FwLkRhdGEuTGVuZ3RoICsgNCk7CgogICAgICAgIC8qIE9VSSBEYXRhICovCiAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgT1VJW2ldKTsKICAgICAgICB9CgogICAgICAgIC8qIEVsZW1lbnQgVHlwZSBJRCAqLwogICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPmFwLkV4dEhUQ2FwLkRhdGEuRWxlbWVudElEKTsKCiAgICAgICAgLyogSFQgQ2FwYWJpbGl0eSBEYXRhICovCiAgICAgICAgZm9yIChpID0gMDsgaSA8IDIyOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5hcC5FeHRIVENhcC5CeXRlW2krMl0pOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAvKiBFbGVtZW50IExlbmd0aCAqLwogICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5FeHRIVENhcC5EYXRhLkxlbmd0aCArIDQpOwoKICAgICAgICAvKiBPVUkgRGF0YSAqLwogICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIE9VSVtpXSk7CiAgICAgICAgfQoKICAgICAgICAvKiBFbGVtZW50IFR5cGUgSUQgKi8KICAgICAgICB6bXdfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuRXh0SFRDYXAuRGF0YS5FbGVtZW50SUQpOwoKICAgICAgICAvKiBIVCBDYXBhYmlsaXR5IERhdGEgKi8KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjI7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHptd19idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5FeHRIVENhcC5CeXRlW2krMl0pOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gb2Zmc2V0Owp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgemZTZW5kTW1GcmFtZSAgICAgICAgICAgICAgICovCi8qICAgICAgU2VuZCBtYW5hZ2VtZW50IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgZnJhbWVUeXBlIDogbWFuYWdlbWVudCBmcmFtZSB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgZHN0IDogZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgcDEgOiBwYXJhbWV0ZXIgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgcDIgOiBwYXJhbWV0ZXIgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgcDMgOiBwYXJhbWV0ZXIgMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIHByb2JlIHJlcSA6IHAxPT4gYldpdGhTU0lELCBwMj0+UiwgcDM9PlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qIHByb2JlIHJzcCA6IHAxPT5SLCBwMj0+UiwgcDM9PlZBUCBJRChBUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qIGRlYXV0aCA6IHAxPT5SZWFzb24gQ29kZSwgcDI9PlIsIHAzPT5WQVAgSUQoQVApICAgICAgICAgICAgICAgICAgICAgICovCi8qIERpc2Fzb2MgOiBwMT0+UmVhc29uIENvZGUsIHAyPT5SLCBwMz0+VkFQIElEKEFQKSAgICAgICAgICAgICAgICAgICAgICovCi8qIEFUSU0gOiBwMT0+UiwgcDI9PlIsIHAzPT5SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qIChyZSlhc29jIHJzcCA6IHAxPT5TdGF0dXMgQ29kZSwgcDI9PkFJRCwgcDM9PlZBUCBJRChBUCkgICAgICAgICAgICAgICovCi8qIGFzb2MgcmVxIDogcDE9PlIsIHAyPT5SLCBwMz0+UiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qIHJlYXNvYyByZXEgOiBwMT0+QVAgTUFDWzBdLCBwMj0+QVAgTUFDWzFdLCBwMz0+QVAgTUFDWzJdICAgICAgICAgICAgICovCi8qIGF1dGggOiBwMT0+bG93PUFsZ29yaXRobSwgaGlnaD1UcmFuc2FjdGlvbiwgcDI9PlN0YXR1cywgcDM9PlZBUCBJRCAgICovCnZvaWQgemZTZW5kTW1GcmFtZSh6ZGV2X3QqIGRldiwgdThfdCBmcmFtZVR5cGUsIHUxNl90KiBkc3QsCiAgICAgICAgICAgICAgICAgICB1MzJfdCBwMSwgdTMyX3QgcDIsIHUzMl90IHAzKQp7CiAgICB6YnVmX3QqIGJ1ZjsKICAgIC8vdTE2X3QgYWRkclRibFNpemU7CiAgICAvL3N0cnVjdCB6c0FkZHJUYmwgYWRkclRibDsKICAgIHUxNl90IG9mZnNldCA9IDA7CiAgICB1MTZfdCBobGVuID0gMzI7CiAgICB1MTZfdCBoZWFkZXJbKDI0KzI1KzEpLzJdOwogICAgdTE2X3QgdmFwID0gMDsKICAgIHUxNl90IGk7CiAgICB1OF90IGVuY3J5cHQgPSAwOwogICAgdTE2X3QgYWlkOwoKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKICAgIHptd19kZWNsYXJlX2Zvcl9jcml0aWNhbF9zZWN0aW9uKCk7CgogICAgem1fbXNnMl9tbShaTV9MVl8yLCAiU2VuZCBtbSBmcmFtZSwgdHlwZT0iLCBmcmFtZVR5cGUpOwogICAgLyogVEJEIDogTWF4aW11bSBzaXplIG9mIG1hbmFnZW1lbnQgZnJhbWUgKi8KICAgIGJ1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgMTAyNCk7CiAgICBpZiAoYnVmID09IE5VTEwpCiAgICB7CiAgICAgICAgem1fbXNnMF9tbShaTV9MVl8wLCAiQWxsb2MgbW0gYnVmIEZhaWwhIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vUmVzZXJ2ZSByb29tIGZvciB3bGFuIGhlYWRlcgogICAgb2Zmc2V0ID0gaGxlbjsKCiAgICBzd2l0Y2ggKGZyYW1lVHlwZSkKICAgIHsKICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJFUSA6CiAgICAgICAgICAgIG9mZnNldCA9IHpmU2VuZFByb2JlUmVxKGRldiwgYnVmLCBvZmZzZXQsICh1OF90KSBwMSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9QUk9CRVJTUCA6CiAgICAgICAgICAgIHptX21zZzBfbW0oWk1fTFZfMywgInByb2JlIHJzcCIpOwogICAgICAgICAgICAvKiAyNC0zMSBUaW1lIFN0YW1wIDogaGFyZHdhcmUgV09OJ1QgZmlsbCB0aGlzIGZpZWxkICovCiAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIDApOwogICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0KzIsIDApOwogICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0KzQsIDApOwogICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0KzYsIDApOwogICAgICAgICAgICBvZmZzZXQrPTg7CgogICAgICAgICAgICAvKiBCZWFjb24gSW50ZXJ2YWwgKi8KICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPmJlYWNvbkludGVydmFsKTsKICAgICAgICAgICAgb2Zmc2V0Kz0yOwoKICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXAgPSAodTE2X3QpIHAzOwogICAgICAgICAgICAgICAgLyogQ2FwYWJpbGl0eSAqLwogICAgICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPmFwLmNhcGFiW3ZhcF0pOwogICAgICAgICAgICAgICAgb2Zmc2V0Kz0yOwogICAgICAgICAgICAgICAgLyogU1NJRCAqLwogICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZBcEFkZEllU3NpZChkZXYsIGJ1Ziwgb2Zmc2V0LCB2YXApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogQ2FwYWJpbGl0eSAqLwogICAgICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLmNhcGFiaWxpdHlbMF0pOwogICAgICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWIoZGV2LCBidWYsIG9mZnNldCsrLCB3ZC0+c3RhLmNhcGFiaWxpdHlbMV0pOwogICAgICAgICAgICAgICAgLyogU1NJRCAqLwogICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVNzaWQoZGV2LCBidWYsIG9mZnNldCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIFN1cHBvcnQgUmF0ZSAqLwogICAgICAgICAgICBpZiAoIHdkLT5mcmVxdWVuY3kgPCAzMDAwICkKICAgICAgICAgICAgewogICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUsIFpNX1JBVEVfU0VUX0NDSyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBEUyBwYXJhbWV0ZXIgc2V0ICovCiAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZURzKGRldiwgYnVmLCBvZmZzZXQpOwoKICAgICAgICAgICAgLyogVE9ETyChRyBJQlNTICovCiAgICAgICAgICAgIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmU3RhQWRkSWVJYnNzKGRldiwgYnVmLCBvZmZzZXQpOwoKICAgICAgICAgICAgICAgIGlmICh3ZC0+ZnJlcXVlbmN5IDwgMzAwMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiggd2QtPndmYy5iSWJzc0dNb2RlCiAgICAgICAgICAgICAgICAgICAgICAgICYmICh3ZC0+c3VwcG9ydE1vZGUgJiAoWk1fV0lSRUxFU1NfTU9ERV8yNF81NHxaTV9XSVJFTEVTU19NT0RFXzI0X04pKSApICAgIC8vIE9ubHkgYWNjb21wYW55IHdpdGggZW5hYmxpbmcgYSBtb2RlIC4KICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVSUCBJbmZvcm1hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICB3ZC0+ZXJwRWxlbWVudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZUVycChkZXYsIGJ1Ziwgb2Zmc2V0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBHIE1vZGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgLyogRXh0ZW5kZWQgU3VwcG9ydGVkIFJhdGVzICovCiAgICAgICAgICAgICAgICAgICAJICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfRVhURU5ERURfUkFURSwgWk1fUkFURV9TRVRfT0ZETSk7CiAgICAgICAgICAgIAkgICAgfQogICAgICAgIAkgICAgfQogICAgICAgICAgICB9CgoKICAgICAgICAgICAgaWYgKCh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKICAgICAgICAgICAgICAgICAmJiAod2QtPmFwLndsYW5UeXBlW3ZhcF0gIT0gWk1fV0xBTl9UWVBFX1BVUkVfQikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIEVSUCBJbmZvcm1hdGlvbiAqLwogICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllRXJwKGRldiwgYnVmLCBvZmZzZXQpOwoKICAgICAgICAgICAgICAgIC8qIEV4dGVuZGVkIFN1cHBvcnRlZCBSYXRlcyAqLwoJCWlmICggd2QtPmZyZXF1ZW5jeSA8IDMwMDAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaTV9XTEFOX0VJRF9FWFRFTkRFRF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBFUlAgSW5mb3JtYXRpb24gKi8KICAgICAgICAgICAgLy9vZmZzZXQgPSB6Zk1tQWRkSWVFcnAoZGV2LCBidWYsIG9mZnNldCk7CgogICAgICAgICAgICAvKiBFeHRlbmRlZCBTdXBwb3J0ZWQgUmF0ZXMgKi8KICAgICAgICAgICAgLy9vZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LAogICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOwoKICAgICAgICAgICAgLyogVE9ETyA6IFJTTiAqLwogICAgICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfQVAgJiYgd2QtPmFwLndwYVN1cHBvcnRbdmFwXSA9PSAxKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVXcGEoZGV2LCBidWYsIG9mZnNldCwgdmFwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICggd2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUyAmJiB3ZC0+c3RhLmF1dGhNb2RlID09IFpNX0FVVEhfTU9ERV9XUEEyUFNLKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZndTdGFBZGRJZVdwYVJzbihkZXYsIGJ1Ziwgb2Zmc2V0LCBaTV9XTEFOX0ZSQU1FX1RZUEVfQVVUSCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIFdNRSBQYXJhbWV0ZXJzICovCiAgICAgICAgICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHdkLT5hcC5xb3NNb2RlID09IDEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZBcEFkZEllV21lUGFyYShkZXYsIGJ1Ziwgb2Zmc2V0LCB2YXApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MgKQogICAgICAgICAgICB7CiAgICAgICAgICAgIC8vIGpobGVlIEhUIDAKICAgICAgICAgICAgLy9DV1lhbmcoKykKICAgICAgICAgICAgICAgIC8qIFRPRE8gOiBOZWVkIHRvIGNoZWNrIGlmIGl0IGlzIG9rICovCiAgICAgICAgICAgIC8qIEhUIENhcGFiaWxpdGllcyBJbmZvICovCiAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRIVENhcGFiaWxpdHkoZGV2LCBidWYsIG9mZnNldCk7CiAgICAgICAgICAgIC8vQ1dZYW5nKCspCiAgICAgICAgICAgIC8qIEV4dGVuZGVkIEhUIENhcGFiaWxpdGllcyBJbmZvICovCiAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRFeHRlbmRlZEhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCB3ZC0+c3RhLmlic3NBZGRpdGlvbmFsSUVTaXplICkKICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmU3RhQWRkSWJzc0FkZGl0aW9uYWxJRShkZXYsIGJ1Ziwgb2Zmc2V0KTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FVVEggOgogICAgICAgICAgICBpZiAocDEgPT0gMHgzMDAwMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaGxlbiArPSA0OwogICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7ICAgICAgICAvLyBmb3IgcmVzZXJ2aW5nIHdlcCBoZWFkZXIKICAgICAgICAgICAgICAgIGVuY3J5cHQgPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBBbGdvdHJpdGhtIE51bWJlciAqLwogICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAodTE2X3QpKHAxJjB4ZmZmZikpOwogICAgICAgICAgICBvZmZzZXQrPTI7CgogICAgICAgICAgICAvKiBUcmFuc2FjdGlvbiBOdW1iZXIgKi8KICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgKHUxNl90KShwMT4+MTYpKTsKICAgICAgICAgICAgb2Zmc2V0Kz0yOwoKICAgICAgICAgICAgLyogU3RhdHVzIENvZGUgKi8KICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgKHUxNl90KXAyKTsKICAgICAgICAgICAgb2Zmc2V0Kz0yOwoKICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXAgPSAodTE2X3QpIHAzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBDaGFsbGVuZ2UgVGV4dCA9PiBzaGFyZS0yIG9yIHNoYXJlLTMgKi8KICAgICAgICAgICAgaWYgKHAxID09IDB4MjAwMDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChwMiA9PSAwKSAvL1N0YXR1cyA9PSBzdWNjZXNzCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgem13X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgMHg4MDEwKTsKICAgICAgICAgICAgICAgICAgICBvZmZzZXQrPTI7CiAgICAgICAgICAgICAgICAgICAgLyogc2hhcmUtMiA6IEFQIGdlbmVyYXRlIGNoYWxsZW5nZSB0ZXh0ICovCiAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8MTI4OyBpKyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB3ZC0+YXAuY2hhbGxlbmdlVGV4dFtpXSA9ICh1OF90KXpmR2V0UmFuZG9tTnVtYmVyKGRldiwgMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHpmQ29weVRvSW50VHhCdWZmZXIoZGV2LCBidWYsIHdkLT5hcC5jaGFsbGVuZ2VUZXh0LCBvZmZzZXQsIDEyOCk7CiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDEyODsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwMSA9PSAweDMwMDAxKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBzaGFyZS0zIDogU1RBIHJldHVybiBjaGFsbGVuZ2UgVGV4dCAqLwogICAgICAgICAgICAgICAgemZDb3B5VG9JbnRUeEJ1ZmZlcihkZXYsIGJ1Ziwgd2QtPnN0YS5jaGFsbGVuZ2VUZXh0LCBvZmZzZXQsIHdkLT5zdGEuY2hhbGxlbmdlVGV4dFsxXSsyKTsKICAgICAgICAgICAgICAgIG9mZnNldCArPSAod2QtPnN0YS5jaGFsbGVuZ2VUZXh0WzFdKzIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSA6CiAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUkVBU09DUkVRIDoKICAgICAgICAgICAgLyogQ2FwYWJpbGl0eSAqLwogICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIHdkLT5zdGEuY2FwYWJpbGl0eVswXSk7CiAgICAgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgd2QtPnN0YS5jYXBhYmlsaXR5WzFdKTsKCiAgICAgICAgICAgIC8qIExpc3RlbiBJbnRlcnZhbCAqLwogICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAweDAwMDUpOwogICAgICAgICAgICBvZmZzZXQrPTI7CgogICAgICAgICAgICAvKiBSZWFzc29jYWl0ZWQgUmVxdWVzdCA6IEN1cnJlbnQgQVAgYWRkcmVzcyAqLwogICAgICAgICAgICBpZiAoZnJhbWVUeXBlID09IFpNX1dMQU5fRlJBTUVfVFlQRV9SRUFTT0NSRVEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPnN0YS5ic3NpZFswXSk7CiAgICAgICAgICAgICAgICBvZmZzZXQrPTI7CiAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5zdGEuYnNzaWRbMV0pOwogICAgICAgICAgICAgICAgb2Zmc2V0Kz0yOwogICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCB3ZC0+c3RhLmJzc2lkWzJdKTsKICAgICAgICAgICAgICAgIG9mZnNldCs9MjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogU1NJRCAqLwogICAgICAgICAgICBvZmZzZXQgPSB6ZlN0YUFkZEllU3NpZChkZXYsIGJ1Ziwgb2Zmc2V0KTsKCgogICAgICAgICAgICBpZiAoIHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA8IDMwMDAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBTdXBwb3J0IFJhdGUgKi8KICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsIFpNX1dMQU5fRUlEX1NVUFBPUlRfUkFURSwgWk1fUkFURV9TRVRfQ0NLKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIFN1cHBvcnQgUmF0ZSAqLwogICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCh3ZC0+c3RhLmNhcGFiaWxpdHlbMV0gJiBaTV9CSVRfMCkgPT0gMSkKICAgICAgICAgICAgeyAgIC8vc3BlY3RydW0gbWFuYWdlbWVudCBmbGFnIGVuYWJsZQogICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVBvd2VyQ2FwKGRldiwgYnVmLCBvZmZzZXQpOwogICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVN1cHBvcnRDaChkZXYsIGJ1Ziwgb2Zmc2V0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA8IDMwMDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIEV4dGVuZGVkIFN1cHBvcnRlZCBSYXRlcyAqLwogICAgICAgICAgICAgICAgaWYgKHdkLT5zdXBwb3J0TW9kZSAmIChaTV9XSVJFTEVTU19NT0RFXzI0XzU0fFpNX1dJUkVMRVNTX01PREVfMjRfTikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwgWk1fV0xBTl9FSURfRVhURU5ERURfUkFURSwgWk1fUkFURV9TRVRfT0ZETSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvL29mZnNldCA9IHpmU3RhQWRkSWVXcGFSc24oZGV2LCBidWYsIG9mZnNldCwgZnJhbWVUeXBlKTsKICAgICAgICAgICAgLy9Nb3ZlIHRvIHdyYXBwZXIgZnVuY3Rpb24sIGZvciBPUyBkaWZmZXJlbmNlLS1DV1lhbmcobSkKICAgICAgICAgICAgLy9mb3Igd2luZG93cyB3cmFwcGVyLCB6ZndTdGFBZGRJZVdwYVJzbigpIHNob3VsZCBiZSBiZWxvdzoKICAgICAgICAgICAgLy91MTZfdCB6ZndTdGFBZGRJZVdwYVJzbih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHUxNl90IG9mZnNldCwgdThfdCBmcmFtZVR5cGUpCiAgICAgICAgICAgIC8vewogICAgICAgICAgICAvLyAgICByZXR1cm4gemZTdGFBZGRJZVdwYVJzbihkZXYsIGJ1Ziwgb2Zmc2V0LCBmcmFtZVR5cGUpOwogICAgICAgICAgICAvL30KICAgICAgICAgICAgb2Zmc2V0ID0gemZ3U3RhQWRkSWVXcGFSc24oZGV2LCBidWYsIG9mZnNldCwgZnJhbWVUeXBlKTsKCiNpZmRlZiBaTV9FTkFCTEVfQ0VOQwogICAgICAgICAgICAvKiBDRU5DICovCiAgICAgICAgICAgIC8vaWYgKHdkLT5zdGEuZW5jcnlNb2RlID09IFpNX0NFTkMpCiAgICAgICAgICAgIG9mZnNldCA9IHpmU3RhQWRkSWVDZW5jKGRldiwgYnVmLCBvZmZzZXQpOwojZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQwogICAgICAgICAgICBpZiAoKCh3ZC0+c3RhLndtZUVuYWJsZWQgJiBaTV9TVEFfV01FX0VOQUJMRV9CSVQpICE9IDApIC8vV01FIGVuYWJsZWQKICAgICAgICAgICAgICAmJiAoKHdkLT5zdGEuYXBXbWVDYXBhYmlsaXR5ICYgMHgxKSAhPSAwKSkgLy9XTUUgQVAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCgod2QtPnN0YS5hcFdtZUNhcGFiaWxpdHkgJiAweDgwKSAhPSAwKSAvL1VBUFNEIEFQCiAgICAgICAgICAgICAgICAgJiYgKCh3ZC0+c3RhLndtZUVuYWJsZWQgJiBaTV9TVEFfVUFQU0RfRU5BQkxFX0JJVCkgIT0gMCkpIC8vVUFQU0QgZW5hYmxlZAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmU3RhQWRkSWVXbWVJbmZvKGRldiwgYnVmLCBvZmZzZXQsIHdkLT5zdGEud21lUW9zSW5mbyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gemZTdGFBZGRJZVdtZUluZm8oZGV2LCBidWYsIG9mZnNldCwgMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gamhsZWUgSFQgMAogICAgICAgICAgICAvL0NXWWFuZygrKQogICAgICAgICAgICBpZiAod2QtPnN0YS5FbmFibGVIVCAhPSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAjaWZuZGVmIFpNX0RJU0FCTEVfQU1TRFU4S19TVVBQT1JUCiAgICAgICAgICAgICAgICAgICAgLy9TdXBwb3J0IDhLIEEtTVNEVQogICAgICAgICAgICAgICAgICAgIGlmICh3ZC0+c3RhLndlcFN0YXR1cyA9PSBaTV9FTkNSWVBUSU9OX1dFUF9ESVNBQkxFRCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuSFRDYXAuRGF0YS5IdENhcEluZm8gfD0gSFRDQVBfTWF4QU1TRFVMZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuSFRDYXAuRGF0YS5IdENhcEluZm8gJj0gKH5IVENBUF9NYXhBTVNEVUxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgI2Vsc2UKICAgICAgICAgICAgICAgICAgICAvL1N1cHBvcnQgNEsgQS1NU0RVCiAgICAgICAgICAgICAgICAgICAgd2QtPnN0YS5IVENhcC5EYXRhLkh0Q2FwSW5mbyAmPSAofkhUQ0FQX01heEFNU0RVTGVuZ3RoKTsKICAgICAgICAgICAgICAgICNlbmRpZgoKICAgICAgICAgICAgICAgIC8qIEhUIENhcGFiaWxpdGllcyBJbmZvICovCiAgICAgICAgICAgICAgICBpZiAod2QtPkJhbmRXaWR0aDQwID09IDEpIHsKICAgICAgICAgICAgICAgICAgICB3ZC0+c3RhLkhUQ2FwLkRhdGEuSHRDYXBJbmZvIHw9IEhUQ0FQX1N1cENoYW5uZWxXaWR0aFNldDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHdkLT5zdGEuSFRDYXAuRGF0YS5IdENhcEluZm8gJj0gfkhUQ0FQX1N1cENoYW5uZWxXaWR0aFNldDsKICAgICAgICAgICAgICAgICAgICAvL3dkLT5zdGEuSFRDYXAuRGF0YS5IdENhcEluZm8gfD0gSFRDQVBfU3VwQ2hhbm5lbFdpZHRoU2V0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHdkLT5zdGEuSFRDYXAuRGF0YS5BTVBEVVBhcmFtICY9IH5IVENBUF9NYXhSeEFNUERVMzsKICAgICAgICAgICAgICAgIHdkLT5zdGEuSFRDYXAuRGF0YS5BTVBEVVBhcmFtIHw9IEhUQ0FQX01heFJ4QU1QRFUzOwogICAgICAgICAgICAgICAgd2QtPnN0YS5IVENhcC5EYXRhLk1DU1NldFsxXSA9IDB4RkY7IC8vIE1DUyA4IH4gMTUKICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRIVENhcGFiaWxpdHkoZGV2LCBidWYsIG9mZnNldCk7CiAgICAgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkUHJlTkhUQ2FwYWJpbGl0eShkZXYsIGJ1Ziwgb2Zmc2V0KTsKICAgICAgICAgICAgICAgIC8vQ1dZYW5nKCspCiAgICAgICAgICAgICAgICAvKiBFeHRlbmRlZCBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLwogICAgICAgICAgICAgICAgLy9vZmZzZXQgPSB6Zk1tQWRkRXh0ZW5kZWRIVENhcGFiaWxpdHkoZGV2LCBidWYsIG9mZnNldCk7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvL1N0b3JlIGFzb2MgcmVxdWVzdCBmcmFtZSBib2R5LCBmb3IgVklTVEEgb25seQogICAgICAgICAgICB3ZC0+c3RhLmFzb2NSZXFGcmFtZUJvZHlTaXplID0gKChvZmZzZXQgLSBobGVuKSA+CiAgICAgICAgICAgICAgICAgICAgWk1fQ0FDSEVEX0ZSQU1FQk9EWV9TSVpFKT8KICAgICAgICAgICAgICAgICAgICBaTV9DQUNIRURfRlJBTUVCT0RZX1NJWkU6KG9mZnNldCAtIGhsZW4pOwogICAgICAgICAgICBmb3IgKGk9MDsgaTx3ZC0+c3RhLmFzb2NSZXFGcmFtZUJvZHlTaXplOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHdkLT5zdGEuYXNvY1JlcUZyYW1lQm9keVtpXSA9IHptd190eF9idWZfcmVhZGIoZGV2LCBidWYsIGkgKyBobGVuKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JTUCA6CiAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUkVBU09DUlNQIDoKICAgICAgICAgICAgdmFwID0gKHUxNl90KSBwMzsKCiAgICAgICAgICAgIC8qIENhcGFiaWxpdHkgKi8KICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgd2QtPmFwLmNhcGFiW3ZhcF0pOwogICAgICAgICAgICBvZmZzZXQrPTI7CgogICAgICAgICAgICAvKiBTdGF0dXMgQ29kZSAqLwogICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAodTE2X3QpcDEpOwogICAgICAgICAgICBvZmZzZXQrPTI7CgogICAgICAgICAgICAvKiBBSUQgKi8KICAgICAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIG9mZnNldCwgKHUxNl90KShwMnwweGMwMDApKTsKICAgICAgICAgICAgb2Zmc2V0Kz0yOwoKCiAgICAgICAgICAgIGlmICggd2QtPmZyZXF1ZW5jeSA8IDMwMDAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgIC8qIFN1cHBvcnQgUmF0ZSAqLwogICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LCBaTV9XTEFOX0VJRF9TVVBQT1JUX1JBVEUsIFpNX1JBVEVfU0VUX0NDSyk7CgogICAgICAgICAgICAvKiBFeHRlbmRlZCBTdXBwb3J0ZWQgUmF0ZXMgKi8KICAgICAgICAgICAgb2Zmc2V0ID0gemZNbUFkZEllU3VwcG9ydFJhdGUoZGV2LCBidWYsIG9mZnNldCwgWk1fV0xBTl9FSURfRVhURU5ERURfUkFURSwgWk1fUkFURV9TRVRfT0ZETSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBTdXBwb3J0IFJhdGUgKi8KICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsIFpNX1dMQU5fRUlEX1NVUFBPUlRfUkFURSwgWk1fUkFURV9TRVRfT0ZETSk7CiAgICAgICAgICAgIH0KCgoKICAgICAgICAgICAgLyogV01FIFBhcmFtZXRlcnMgKi8KICAgICAgICAgICAgaWYgKHdkLT53bGFuTW9kZSA9PSBaTV9NT0RFX0FQKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBUT0RPIDogaWYgV01FIFNUQSB0aGVuIHNlbmQgV01FIHBhcmFtZXRlciBlbGVtZW50ICovCiAgICAgICAgICAgICAgICBpZiAod2QtPmFwLnFvc01vZGUgPT0gMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSB6ZkFwQWRkSWVXbWVQYXJhKGRldiwgYnVmLCBvZmZzZXQsIHZhcCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gamhsZWUgSFQgMAogICAgICAgICAgICAvL0NXWWFuZygrKQogICAgICAgICAgICAvKiBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLwogICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSFRDYXBhYmlsaXR5KGRldiwgYnVmLCBvZmZzZXQpOwogICAgICAgICAgICAvL0NXWWFuZygrKQogICAgICAgICAgICAvKiBFeHRlbmRlZCBIVCBDYXBhYmlsaXRpZXMgSW5mbyAqLwogICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkRXh0ZW5kZWRIVENhcGFiaWxpdHkoZGV2LCBidWYsIG9mZnNldCk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9BVElNIDoKICAgICAgICAgICAgLyogTlVMTCBmcmFtZSAqLwogICAgICAgICAgICAvKiBUT0RPIDogYWRkIHR3byBkdW1iIGJ5dGVzIHRlbXBvcmFyaWx5ICovCiAgICAgICAgICAgIG9mZnNldCArPSAyOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUU9TX05VTEwgOgogICAgICAgICAgICB6bXdfYnVmX3dyaXRlaChkZXYsIGJ1Ziwgb2Zmc2V0LCAweDAwMTApOwogICAgICAgICAgICBvZmZzZXQgKz0gMjsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgWk1fV0xBTl9EQVRBX0ZSQU1FIDoKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0RJU0FTT0MgOgogICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0RFQVVUSCA6CiAgICAgICAgICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKICAgICAgICAgICAgewogICAgICAgICAgICAgIHZhcCA9ICh1MTZfdCkgcDM7CgogICAgICAgICAgICAgIGFpZCA9IHpmQXBGaW5kU3RhKGRldiwgZHN0KTsKICAgICAgICAgICAgICBpZiAoYWlkICE9IDB4ZmZmZikKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CiAgICAgICAgICAgICAgICAgIC8qIENsZWFyIFNUQSB0YWJsZSAqLwogICAgICAgICAgICAgICAgICB3ZC0+YXAuc3RhVGFibGVbYWlkXS52YWxpZCA9IDA7CgogICAgICAgICAgICAgICAgICB6bXdfbGVhdmVfY3JpdGljYWxfc2VjdGlvbihkZXYpOwoKICAgICAgICAgICAgICAgICAgaWYgKHdkLT56ZmNiRGlzQXNvY05vdGlmeSAhPSBOVUxMKQogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICB3ZC0+emZjYkRpc0Fzb2NOb3RpZnkoZGV2LCAodThfdCopZHN0LCB2YXApOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIFJlYXNvbiBDb2RlICovCiAgICAgICAgICAgIHptd190eF9idWZfd3JpdGVoKGRldiwgYnVmLCBvZmZzZXQsICh1MTZfdClwMSk7CiAgICAgICAgICAgIG9mZnNldCs9MjsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgemZ3QnVmU2V0U2l6ZShkZXYsIGJ1Ziwgb2Zmc2V0KTsKCiAgICB6bV9tc2cyX21tKFpNX0xWXzIsICJtYW5hZ2VtZW50IGZyYW1lIGJvZHkgc2l6ZT0iLCBvZmZzZXQtaGxlbik7CgogICAgLy9Db3B5IHdsYW4gaGVhZGVyCiAgICB6ZlR4R2VuTW1IZWFkZXIoZGV2LCBmcmFtZVR5cGUsIGRzdCwgaGVhZGVyLCBvZmZzZXQtaGxlbiwgYnVmLCB2YXAsIGVuY3J5cHQpOwogICAgZm9yIChpPTA7IGk8KGhsZW4+PjEpOyBpKyspCiAgICB7CiAgICAgICAgem13X3R4X2J1Zl93cml0ZWgoZGV2LCBidWYsIGkqMiwgaGVhZGVyW2ldKTsKICAgIH0KCiAgICAvKiBHZXQgYnVmZmVyIERNQSBhZGRyZXNzICovCiAgICAvL2lmICgoYWRkclRibFNpemUgPSB6ZndCdWZNYXBEbWEoZGV2LCBidWYsICZhZGRyVGJsKSkgPT0gMCkKICAgIC8vaWYgKChhZGRyVGJsU2l6ZSA9IHpmd01hcFR4RG1hKGRldiwgYnVmLCAmYWRkclRibCkpID09IDApCiAgICAvL3sKICAgIC8vICAgIGdvdG8gemxFcnJvcjsKICAgIC8vfQoKICAgIHptX21zZzJfbW0oWk1fTFZfMiwgIm9mZnNldD0iLCBvZmZzZXQpOwogICAgem1fbXNnMl9tbShaTV9MVl8yLCAiaGxlbj0iLCBobGVuKTsKICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiYWRkclRibFNpemU9IiwgYWRkclRibFNpemUpOwogICAgLy96bV9tc2cyX21tKFpNX0xWXzIsICJhZGRyVGJsLmxlblswXT0iLCBhZGRyVGJsLmxlblswXSk7CiAgICAvL3ptX21zZzJfbW0oWk1fTFZfMiwgImFkZHJUYmwucGh5c0FkZHJsWzBdPSIsIGFkZHJUYmwucGh5c0FkZHJsWzBdKTsKICAgIC8vem1fbXNnMl9tbShaTV9MVl8yLCAiYnVmLT5kYXRhPSIsIGJ1Zi0+ZGF0YSk7CgogICAgI2lmIDAKICAgIGVyciA9IHpmSHBTZW5kKGRldiwgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgMCwgYnVmLCAwLAoJCSAgIFpNX0lOVEVSTkFMX0FMTE9DX0JVRiwgMCwgMHhmZik7CiAgICBpZiAoZXJyICE9IFpNX1NVQ0NFU1MpCiAgICB7CiAgICAgICAgZ290byB6bEVycm9yOwogICAgfQogICAgI2Vsc2UKICAgIHpmUHV0Vm1tcShkZXYsIGJ1Zik7CiAgICB6ZlB1c2hWdHhxKGRldik7CiAgICAjZW5kaWYKCiAgICByZXR1cm47CiNpZiAwCnpsRXJyb3I6CgogICAgemZ3QnVmRnJlZShkZXYsIGJ1ZiwgMCk7CiAgICByZXR1cm47CiNlbmRpZgp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlByb2Nlc3NNYW5hZ2VtZW50ICAgICAgICAgKi8KLyogICAgICBQcm9jZXNzIHJlY2VpdmVkIG1hbmFnZW1lbnQgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBidWYgOiByZWNlaXZlZCBtYW5hZ2VtZW50IGZyYW1lIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgU3RlcGhlbiBDaGVuICAgICAgICBaeURBUyBUZWNobm9sb2d5IENvcnBvcmF0aW9uICAgIDIwMDUuMTAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgemZQcm9jZXNzTWFuYWdlbWVudCh6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogQWRkSW5mbykgLy9DV1lhbmcobSkKewogICAgdThfdCBmcmFtZVR5cGU7CiAgICB1MTZfdCB0YVszXTsKICAgIHUxNl90IHJhWzNdOwogICAgdTE2X3QgdmFwID0gMCwgaW5kZXggPSAwOwogICAgLy91MTZfdCBpOwoKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKCiAgICByYVswXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDQpOwogICAgcmFbMV0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCA2KTsKICAgIHJhWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgOCk7CgogICAgdGFbMF0gPSB6bXdfcnhfYnVmX3JlYWRoKGRldiwgYnVmLCAxMCk7CiAgICB0YVsxXSA9IHptd19yeF9idWZfcmVhZGgoZGV2LCBidWYsIDEyKTsKICAgIHRhWzJdID0gem13X3J4X2J1Zl9yZWFkaChkZXYsIGJ1ZiwgMTQpOwoKICAgIGZyYW1lVHlwZSA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIDApOwoKICAgIGlmICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9BUCkKICAgIHsKI2lmIDEKICAgICAgICB2YXAgPSAwOwogICAgICAgIGlmICgocmFbMF0gJiAweDEpICE9IDEpCiAgICAgICAgewogICAgICAgICAgICAvKiBBUCA6IEZpbmQgdmlydHVhbCBBUCAqLwogICAgICAgICAgICBpbmRleCA9IHpmQXBGaW5kU3RhKGRldiwgdGEpOwogICAgICAgICAgICBpZiAoaW5kZXggIT0gMHhmZmZmKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXAgPSB3ZC0+YXAuc3RhVGFibGVbaW5kZXhdLnZhcDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB6bV9tc2cyX21tKFpNX0xWXzIsICJ2YXA9IiwgdmFwKTsKI2VuZGlmCgogICAgICAgIC8qIERpc3BhdGNoIGJ5IGZyYW1lIHR5cGUgKi8KICAgICAgICBzd2l0Y2ggKGZyYW1lVHlwZSkKICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBCZWFjb24gKi8KICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQkVBQ09OIDoKICAgICAgICAgICAgICAgIHpmQXBQcm9jZXNzQmVhY29uKGRldiwgYnVmKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gKi8KICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVVUSCA6CiAgICAgICAgICAgICAgICB6ZkFwUHJvY2Vzc0F1dGgoZGV2LCBidWYsIHRhLCB2YXApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAvKiBBc3NvY2lhdGlvbiByZXF1ZXN0ICovCiAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FTT0NSRVEgOgogICAgICAgICAgICAgICAgLyogUmVhc3NvY2lhdGlvbiByZXF1ZXN0ICovCiAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX1JFQVNPQ1JFUSA6CiAgICAgICAgICAgICAgICB6ZkFwUHJvY2Vzc0Fzb2NSZXEoZGV2LCBidWYsIHRhLCB2YXApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAvKiBBc3NvY2lhdGlvbiByZXNwb25zZSAqLwogICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9BU09DUlNQIDoKICAgICAgICAgICAgICAgIC8vemZBcFByb2Nlc3NBc29jUnNwKGRldiwgYnVmKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgLyogRGVhdXRoZW50aWNhdGlvbiAqLwogICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEggOgogICAgICAgICAgICAgICAgemZBcFByb2Nlc3NEZWF1dGgoZGV2LCBidWYsIHRhLCB2YXApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAvKiBEaXNhc3NvY2lhdGlvbiAqLwogICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9ESVNBU09DIDoKICAgICAgICAgICAgICAgIHpmQXBQcm9jZXNzRGlzYXNvYyhkZXYsIGJ1ZiwgdGEsIHZhcCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIC8qIFByb2JlIHJlcXVlc3QgKi8KICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSRVEgOgogICAgICAgICAgICAgICAgemZQcm9jZXNzUHJvYmVSZXEoZGV2LCBidWYsIHRhKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgLyogUHJvYmUgcmVzcG9uc2UgKi8KICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSU1AgOgogICAgICAgICAgICAgICAgemZBcFByb2Nlc3NQcm9iZVJzcChkZXYsIGJ1ZiwgQWRkSW5mbyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIC8qIEFjdGlvbiAqLwogICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9BQ1RJT04gOgogICAgICAgICAgICAgICAgemZBcFByb2Nlc3NBY3Rpb24oZGV2LCBidWYpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgZWxzZSAvL2lmICgod2QtPndsYW5Nb2RlID09IFpNX01PREVfSU5GUkFTVFJVQ1RVUkUpIHx8ICh3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTKSkKICAgIHsKICAgICAgICAvKiBEaXNwYXRjaCBieSBmcmFtZSB0eXBlICovCiAgICAgICAgc3dpdGNoIChmcmFtZVR5cGUpCiAgICAgICAgewogICAgICAgICAgICAgICAgLyogQmVhY29uICovCiAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0JFQUNPTiA6CiAgICAgICAgICAgICAgICAvKiBpZiBlbmFibGUgODAyLjExaCBhbmQgY3VycmVudCBjaGFubmVsIGlzIHNpbGVudCBidXQgcmVjZWl2ZSBiZWFjb24gZnJvbSBvdGhlciBBUCAqLwogICAgICAgICAgICAgICAgaWYgKCgod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbd2QtPnJlZ3VsYXRpb25UYWJsZS5DdXJDaEluZGV4XS5jaGFubmVsRmxhZ3MKICAgICAgICAgICAgICAgICAgICAgICAgJiBaTV9SRUdfRkxBR19DSEFOTkVMX0NTQSkgIT0gMCkgJiYgd2QtPnN0YS5ERlNFbmFibGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbd2QtPnJlZ3VsYXRpb25UYWJsZS5DdXJDaEluZGV4XS5jaGFubmVsRmxhZ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICY9IH4oWk1fUkVHX0ZMQUdfQ0hBTk5FTF9DU0EgJiBaTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgemZTdGFQcm9jZXNzQmVhY29uKGRldiwgYnVmLCBBZGRJbmZvKTsgLy9DV1lhbmcobSkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgLyogQXV0aGVudGljYXRpb24gKi8KICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVVUSCA6CiAgICAgICAgICAgICAgICAvKiBUT0RPIDogdmFwIHBhcmFtZXRlciBpcyB1c2VsZXNzIGluIFNUQSBtb2RlLCBnZXQgcmlkIG9mIGl0ICovCiAgICAgICAgICAgICAgICB6ZlN0YVByb2Nlc3NBdXRoKGRldiwgYnVmLCB0YSwgMCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIC8qIEFzc29jaWF0aW9uIHJlcXVlc3QgKi8KICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfQVNPQ1JFUSA6CiAgICAgICAgICAgICAgICAvKiBUT0RPIDogdmFwIHBhcmFtZXRlciBpcyB1c2VsZXNzIGluIFNUQSBtb2RlLCBnZXQgcmlkIG9mIGl0ICovCiAgICAgICAgICAgICAgICB6ZlN0YVByb2Nlc3NBc29jUmVxKGRldiwgYnVmLCB0YSwgMCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIC8qIEFzc29jaWF0aW9uIHJlc3BvbnNlICovCiAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX0FTT0NSU1AgOgogICAgICAgICAgICAgICAgLyogUmVhc3NvY2lhdGlvbiByZXF1ZXN0ICovCiAgICAgICAgICAgIGNhc2UgWk1fV0xBTl9GUkFNRV9UWVBFX1JFQVNPQ1JTUCA6CiAgICAgICAgICAgICAgICB6ZlN0YVByb2Nlc3NBc29jUnNwKGRldiwgYnVmKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgLyogRGVhdXRoZW50aWNhdGlvbiAqLwogICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9ERUFVVEggOgogICAgICAgICAgICAgICAgem1fZGVidWdfbXNnMCgiRGVhdXRoZW50aWNhdGlvbiByZWNlaXZlZCIpOwogICAgICAgICAgICAgICAgemZTdGFQcm9jZXNzRGVhdXRoKGRldiwgYnVmKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgLyogRGlzYXNzb2NpYXRpb24gKi8KICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfRElTQVNPQyA6CiAgICAgICAgICAgICAgICB6bV9kZWJ1Z19tc2cwKCJEaXNhc3NvY2lhdGlvbiByZWNlaXZlZCIpOwogICAgICAgICAgICAgICAgemZTdGFQcm9jZXNzRGlzYXNvYyhkZXYsIGJ1Zik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIC8qIFByb2JlIHJlcXVlc3QgKi8KICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSRVEgOgogICAgICAgICAgICAgICAgemZQcm9jZXNzUHJvYmVSZXEoZGV2LCBidWYsIHRhKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgLyogUHJvYmUgcmVzcG9uc2UgKi8KICAgICAgICAgICAgY2FzZSBaTV9XTEFOX0ZSQU1FX1RZUEVfUFJPQkVSU1AgOgogICAgICAgICAgICAgICAgLyogaWYgZW5hYmxlIDgwMi4xMWggYW5kIGN1cnJlbnQgY2hhbm5lbCBpcyBzaWxlbnQgYnV0IHJlY2VpdmUgcHJvYmUgcmVzcG9uc2UgZnJvbSBvdGhlciBBUCAqLwogICAgICAgICAgICAgICAgaWYgKCgod2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbd2QtPnJlZ3VsYXRpb25UYWJsZS5DdXJDaEluZGV4XS5jaGFubmVsRmxhZ3MKICAgICAgICAgICAgICAgICAgICAgICAgJiBaTV9SRUdfRkxBR19DSEFOTkVMX0NTQSkgIT0gMCkgJiYgd2QtPnN0YS5ERlNFbmFibGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgd2QtPnJlZ3VsYXRpb25UYWJsZS5hbGxvd0NoYW5uZWxbd2QtPnJlZ3VsYXRpb25UYWJsZS5DdXJDaEluZGV4XS5jaGFubmVsRmxhZ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICY9IH4oWk1fUkVHX0ZMQUdfQ0hBTk5FTF9DU0EgJiBaTV9SRUdfRkxBR19DSEFOTkVMX1BBU1NJVkUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgemZTdGFQcm9jZXNzUHJvYmVSc3AoZGV2LCBidWYsIEFkZEluZm8pOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9BVElNOgogICAgICAgICAgICAgICAgemZTdGFQcm9jZXNzQXRpbShkZXYsIGJ1Zik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIC8qIEFjdGlvbiAqLwogICAgICAgICAgICBjYXNlIFpNX1dMQU5fRlJBTUVfVFlQRV9BQ1RJT04gOgogICAgICAgICAgICAgICAgem1fbXNnMF9tbShaTV9MVl8yLCAiUHJvY2Vzc0FjdGlvbk1ndEZyYW1lIik7CiAgICAgICAgICAgICAgICB6ZlN0YVByb2Nlc3NBY3Rpb24oZGV2LCBidWYpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUHJvY2Vzc1Byb2JlUmVxICAgICAgICAgICAqLwovKiAgICAgIFByb2Nlc3MgcHJvYmUgcmVxdWVzdCBtYW5hZ2VtZW50IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGJ1ZiA6IGF1dGggZnJhbWUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIFN0ZXBoZW4gQ2hlbiAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjEwICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHpmUHJvY2Vzc1Byb2JlUmVxKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZiwgdTE2X3QqIHNyYykKewogICAgdTE2X3Qgb2Zmc2V0OwogICAgdThfdCBsZW47CiAgICB1MTZfdCBpLCBqOwogICAgdThfdCBjaDsKICAgIHUxNl90IHNlbmRGbGFnOwoKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKCiAgICAvKiBjaGVjayBtb2RlIDogQVAvSUJTUyAqLwogICAgaWYgKCh3ZC0+d2xhbk1vZGUgIT0gWk1fTU9ERV9BUCkgJiYgKHdkLT53bGFuTW9kZSAhPSBaTV9NT0RFX0lCU1MpKQogICAgewogICAgICAgIHptX21zZzBfbW0oWk1fTFZfMywgIklnbm9yZSBwcm9iZSByZXEiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCh3ZC0+d2xhbk1vZGUgIT0gWk1fTU9ERV9BUCkgJiYgKHdkLT5zdGEuYWRhcHRlclN0YXRlID09IFpNX1NUQV9TVEFURV9ESVNDT05ORUNUKSkKICAgIHsKICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzMsICJQYWNrZXRzIGRyb3BwZWQgZHVlIHRvIGRpc2Nvbm5lY3Qgc3RhdGUiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKICAgIHsKICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUlNQLCBzcmMsIDAsIDAsIDApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyogY2hlY2sgU1NJRCAqLwogICAgb2Zmc2V0ID0gemZGaW5kRWxlbWVudChkZXYsIGJ1ZiwgWk1fV0xBTl9FSURfU1NJRCk7CiAgICBpZiAob2Zmc2V0ID09IDB4ZmZmZikKICAgIHsKICAgICAgICB6bV9tc2cwX21tKFpNX0xWXzMsICJwcm9iZSByZXEgU1NJRCBub3QgZm91bmQiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOwoKICAgIGZvciAoaT0wOyBpPFpNX01BWF9BUF9TVVBQT1JUOyBpKyspCiAgICB7CiAgICAgICAgaWYgKCh3ZC0+YXAuYXBCaXRtYXAgJiAoMTw8aSkpICE9IDApCiAgICAgICAgewogICAgICAgICAgICB6bV9tc2cxX21tKFpNX0xWXzMsICJsZW49IiwgbGVuKTsKICAgICAgICAgICAgc2VuZEZsYWcgPSAwOwogICAgICAgICAgICAvKiBib2FyZGNhc3QgU1NJRCAqLwogICAgICAgICAgICBpZiAobGVuID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh3ZC0+YXAuaGlkZVNzaWRbaV0gPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzZW5kRmxhZyA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogTm90IGJyb2FkY2FzdCBTU0lEICovCiAgICAgICAgICAgIGVsc2UgaWYgKHdkLT5hcC5zc2lkTGVuW2ldID09IGxlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yIChqPTA7IGo8bGVuOyBqKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2ggPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMitqKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2ggIT0gd2QtPmFwLnNzaWRbaV1bal0pCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaiA9PSBsZW4pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2VuZEZsYWcgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzZW5kRmxhZyA9PSAxKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBTZW5kIHByb2JlIHJlc3BvbnNlICovCiAgICAgICAgICAgICAgICB6ZlNlbmRNbUZyYW1lKGRldiwgWk1fV0xBTl9GUkFNRV9UWVBFX1BST0JFUlNQLCBzcmMsIGksIDAsIGkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmUHJvY2Vzc1Byb2JlUnNwICAgICAgICAgICAqLwovKiAgICAgIFByb2Nlc3MgcHJvYmUgcmVzcG9uc2UgbWFuYWdlbWVudCBmcmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGJ1ZiA6IGF1dGggZnJhbWUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgQWRkSW5mbyA6IFJ4IEhlYWRlciBhbmQgUnggTWFjIFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIEFyZXNzIFlhbmcgICAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA2LjExICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHpmUHJvY2Vzc1Byb2JlUnNwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBBZGRJbmZvKQp7CiAgICAvKiBHYXRoZXIgc2NhbiByZXN1bHQgKi8KICAgIC8qIFBhcnNlIFRJTSBhbmQgc2VuZCBQUy1QT0xMIGluIHBvd2VyIHNhdmluZyBtb2RlICovCiAgICBzdHJ1Y3QgenNXbGFuUHJvYmVSc3BGcmFtZUhlYWRlciogIHBQcm9iZVJzcEhlYWRlcjsKICAgIHN0cnVjdCB6c0Jzc0luZm8qIHBCc3NJbmZvOwogICAgdThfdCAgIHBCdWZbc2l6ZW9mKHN0cnVjdCB6c1dsYW5Qcm9iZVJzcEZyYW1lSGVhZGVyKV07CiAgICBpbnQgICAgcmVzOwoKICAgIHptd19nZXRfd2xhbl9kZXYoZGV2KTsKCiAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOwoKICAgIHpmQ29weUZyb21SeEJ1ZmZlcihkZXYsIGJ1ZiwgcEJ1ZiwgMCwKICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHpzV2xhblByb2JlUnNwRnJhbWVIZWFkZXIpKTsKICAgIHBQcm9iZVJzcEhlYWRlciA9IChzdHJ1Y3QgenNXbGFuUHJvYmVSc3BGcmFtZUhlYWRlciopIHBCdWY7CgogICAgem13X2VudGVyX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKCiAgICAvL3ptX2RlYnVnX21zZzEoImJzcyBjb3VudCA9ICIsIHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCk7CgogICAgcEJzc0luZm8gPSB6ZlN0YUZpbmRCc3NJbmZvKGRldiwgYnVmLCBwUHJvYmVSc3BIZWFkZXIpOwoKICAgIC8vaWYgKCBpID09IHdkLT5zdGEuYnNzTGlzdC5ic3NDb3VudCApCiAgICBpZiAoIHBCc3NJbmZvID09IE5VTEwgKQogICAgewogICAgICAgIC8qIEFsbG9jYXRlIGEgbmV3IGVudHJ5IGlmIEJTUyBub3QgaW4gdGhlIHNjYW4gbGlzdCAqLwogICAgICAgIHBCc3NJbmZvID0gemZCc3NJbmZvQWxsb2NhdGUoZGV2KTsKICAgICAgICBpZiAocEJzc0luZm8gIT0gTlVMTCkKICAgICAgICB7CiAgICAgICAgICAgIHJlcyA9IHpmU3RhSW5pdEJzc0luZm8oZGV2LCBidWYsIHBQcm9iZVJzcEhlYWRlciwgcEJzc0luZm8sIEFkZEluZm8sIDApOwogICAgICAgICAgICAvL3pmRHVtcFNTSUQocEJzc0luZm8tPnNzaWRbMV0sICYocEJzc0luZm8tPnNzaWRbMl0pKTsKICAgICAgICAgICAgaWYgKCByZXMgIT0gMCApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHpmQnNzSW5mb0ZyZWUoZGV2LCBwQnNzSW5mbyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB6ZkJzc0luZm9JbnNlcnRUb0xpc3QoZGV2LCBwQnNzSW5mbyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgcmVzID0gemZTdGFJbml0QnNzSW5mbyhkZXYsIGJ1ZiwgcFByb2JlUnNwSGVhZGVyLCBwQnNzSW5mbywgQWRkSW5mbywgMSk7CiAgICAgICAgaWYgKHJlcyA9PSAyKQogICAgICAgIHsKICAgICAgICAgICAgemZCc3NJbmZvUmVtb3ZlRnJvbUxpc3QoZGV2LCBwQnNzSW5mbyk7CiAgICAgICAgICAgIHpmQnNzSW5mb0ZyZWUoZGV2LCBwQnNzSW5mbyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCB3ZC0+d2xhbk1vZGUgPT0gWk1fTU9ERV9JQlNTICkKICAgICAgICB7CiAgICAgICAgICAgIGludCBpZHg7CgogICAgICAgICAgICAvLyBJdCB3b3VsZCByZXNldCB0aGUgYWxpdmUgY291bnRlciBpZiB0aGUgcGVlciBzdGF0aW9uIGlzIGZvdW5kIQogICAgICAgICAgICB6ZlN0YUZpbmRGcmVlT3Bwb3NpdGUoZGV2LCAodTE2X3QgKilwQnNzSW5mby0+bWFjYWRkciwgJmlkeCk7CiAgICAgICAgfQogICAgfQoKICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CgogICAgcmV0dXJuOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgIHpmU2VuZFByb2JlUmVxICAgICAgICAgICAgICAqLwovKiAgICAgIFNlbmQgcHJvYmUgcmVxdWVzdCBtYW5hZ2VtZW50IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIEppLUh1YW5nIExlZSAgICAgICAgWnlEQVMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAgICAyMDA1LjExICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdTE2X3QgemZTZW5kUHJvYmVSZXEoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1MTZfdCBvZmZzZXQsIHU4X3QgYldpdGhTU0lEKQp7CiAgICB6bXdfZ2V0X3dsYW5fZGV2KGRldik7CiAgICB6bXdfZGVjbGFyZV9mb3JfY3JpdGljYWxfc2VjdGlvbigpOwoKCiAgICAvKiBTU0lEICovCiAgICBpZiAoYldpdGhTU0lEID09IDApICAvKiBicm9hZGNhc3Qgc3NpZCAqLwogICAgewogICAgICAgIC8vem13X2xlYXZlX2NyaXRpY2FsX3NlY3Rpb24oZGV2KTsKICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1NTSUQpOwogICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMCk7ICAgLyogbGVuZ3RoID0gMCAqLwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHptd19lbnRlcl9jcml0aWNhbF9zZWN0aW9uKGRldik7CiAgICAgICAgaWYgKHdkLT53cy5wcm9iaW5nU3NpZExpc3RbYldpdGhTU0lELTFdLnNzaWRMZW4gPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgWk1fV0xBTl9FSURfU1NJRCk7CiAgICAgICAgICAgIHptd190eF9idWZfd3JpdGViKGRldiwgYnVmLCBvZmZzZXQrKywgMCk7ICAgLyogbGVuZ3RoID0gMCAqLwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssIFpNX1dMQU5fRUlEX1NTSUQpOwogICAgICAgICAgICB6bXdfdHhfYnVmX3dyaXRlYihkZXYsIGJ1Ziwgb2Zmc2V0KyssCiAgICAgICAgICAgICAgICAgICAgd2QtPndzLnByb2JpbmdTc2lkTGlzdFtiV2l0aFNTSUQtMV0uc3NpZExlbik7CiAgICAgICAgICAgIHpmQ29weVRvSW50VHhCdWZmZXIoZGV2LCBidWYsCiAgICAgICAgICAgICAgICAgICAgd2QtPndzLnByb2JpbmdTc2lkTGlzdFtiV2l0aFNTSUQtMV0uc3NpZCwKICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgd2QtPndzLnByb2JpbmdTc2lkTGlzdFtiV2l0aFNTSUQtMV0uc3NpZExlbik7IC8qIHNzaWQgKi8KICAgICAgICAgICAgb2Zmc2V0ICs9IHdkLT53cy5wcm9iaW5nU3NpZExpc3RbYldpdGhTU0lELTFdLnNzaWRMZW47CiAgICAgICAgfQogICAgICAgIHptd19sZWF2ZV9jcml0aWNhbF9zZWN0aW9uKGRldik7CiAgICB9CgogICAgLyogU3VwcG9ydGVkIHJhdGVzICovCiAgICBpZiAoIHdkLT5zdGEuY3VycmVudEZyZXF1ZW5jeSA8IDMwMDAgKQogICAgeyAgIC8qIDgwMi4xMWIrZyAqLwogICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9DQ0spOwoKICAgICAgICBpZiAod2QtPnN1cHBvcnRNb2RlICYgKFpNX1dJUkVMRVNTX01PREVfMjRfNTR8Wk1fV0lSRUxFU1NfTU9ERV8yNF9OKSkgewogICAgICAgICAgICBpZiAod2QtPndsYW5Nb2RlID09IFpNX01PREVfSUJTUykgewogICAgICAgICAgICAgICAgaWYgKHdkLT53ZmMuYklic3NHTW9kZSkgewogICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfRVhURU5ERURfUkFURSwgWk1fUkFURV9TRVRfT0ZETSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBvZmZzZXQgPSB6Zk1tQWRkSWVTdXBwb3J0UmF0ZShkZXYsIGJ1Ziwgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpNX1dMQU5fRUlEX0VYVEVOREVEX1JBVEUsIFpNX1JBVEVfU0VUX09GRE0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgeyAgLyogODAyLjExYSAqLwogICAgICAgIG9mZnNldCA9IHpmTW1BZGRJZVN1cHBvcnRSYXRlKGRldiwgYnVmLCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWk1fV0xBTl9FSURfU1VQUE9SVF9SQVRFLCBaTV9SQVRFX1NFVF9PRkRNKTsKICAgIH0KCiAgICByZXR1cm4gb2Zmc2V0Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgRlVOQ1RJT04gREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICB6ZlVwZGF0ZURlZmF1bHRRb3NQYXJhbWV0ZXIgKi8KLyogICAgICBVcGRhdGUgVHhRcyBDV01JTiwgQ1dNQVgsIEFJRlMgYW5kIFRYTyB0byBXTUUgZGVmYXVsdCB2YWx1ZS4gICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgSU5QVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBkZXYgOiBkZXZpY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBtb2RlIDogMD0+U1RBLCAxPT5BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgT1VUUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgQVVUSE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICBTdGVwaGVuICAgICAgICAgICAgIFp5REFTIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gICAgMjAwNi42ICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB6ZlVwZGF0ZURlZmF1bHRRb3NQYXJhbWV0ZXIoemRldl90KiBkZXYsIHU4X3QgbW9kZSkKewogICAgdTE2X3QgY3dtaW5bNV07CiAgICB1MTZfdCBjd21heFs1XTsKICAgIHUxNl90IGFpZnNbNV07CiAgICB1MTZfdCB0eG9wWzVdOwoKICAgIC8qIFdNTSBwYXJhbWV0ZXIgZm9yIFNUQSAqLwogICAgLyogQmVzdCBFZmZvciAqLwogICAgY3dtaW5bMF0gPSAxNTsKICAgIGN3bWF4WzBdID0gMTAyMzsKICAgIGFpZnNbMF0gPSAzICogOSArIDEwOwogICAgdHhvcFswXSA9IDA7CiAgICAvKiBCYWNrIEdyb3VuZCAqLwogICAgY3dtaW5bMV0gPSAxNTsKICAgIGN3bWF4WzFdID0gMTAyMzsKICAgIGFpZnNbMV0gPSA3ICogOSArIDEwOwogICAgdHhvcFsxXSA9IDA7CiAgICAvKiBWSURFTyAqLwogICAgY3dtaW5bMl0gPSA3OwogICAgY3dtYXhbMl0gPSAxNTsKICAgIGFpZnNbMl0gPSAyICogOSArIDEwOwogICAgdHhvcFsyXSA9IDk0OwogICAgLyogVk9JQ0UgKi8KICAgIGN3bWluWzNdID0gMzsKICAgIGN3bWF4WzNdID0gNzsKICAgIGFpZnNbM10gPSAyICogOSArIDEwOwogICAgdHhvcFszXSA9IDQ3OwogICAgLyogU3BlY2lhbCBUeFEgKi8KICAgIGN3bWluWzRdID0gMzsKICAgIGN3bWF4WzRdID0gNzsKICAgIGFpZnNbNF0gPSAyICogOSArIDEwOwogICAgdHhvcFs0XSA9IDA7CgogICAgLyogV01NIHBhcmFtZXRlciBmb3IgQVAgKi8KICAgIGlmIChtb2RlID09IDEpCiAgICB7CiAgICAgICAgY3dtYXhbMF0gPSA2MzsKICAgICAgICBhaWZzWzNdID0gMSAqIDkgKyAxMDsKICAgICAgICBhaWZzWzRdID0gMSAqIDkgKyAxMDsKICAgIH0KICAgIHpmSHBVcGRhdGVRb3NQYXJhbWV0ZXIoZGV2LCBjd21pbiwgY3dtYXgsIGFpZnMsIHR4b3ApOwp9Cgp1MTZfdCB6ZkZpbmRBVEhFeHRDYXAoemRldl90KiBkZXYsIHpidWZfdCogYnVmLCB1OF90IHR5cGUsIHU4X3Qgc3VidHlwZSkKewogICAgdThfdCBzdWJUeXBlOwogICAgdTE2X3Qgb2Zmc2V0OwogICAgdTE2X3QgYnVmTGVuOwogICAgdTE2X3QgZWxlbjsKICAgIHU4X3QgaWQ7CiAgICB1OF90IHRtcDsKCiAgICAvKiBHZXQgb2Zmc2V0IG9mIGZpcnN0IGVsZW1lbnQgKi8KICAgIHN1YlR5cGUgPSAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCkgPj4gNCk7CgogICAgb2Zmc2V0ID0gemdFbGVtZW50T2Zmc2V0VGFibGVbc3ViVHlwZV07CiAgICBpZiAob2Zmc2V0ID09IDB4ZmYpCiAgICB7CiAgICAgICAgem1fYXNzZXJ0KDApOwogICAgfQoKICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KICAgIG9mZnNldCArPSAyNDsKCiAgICBidWZMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKCiAgICAvKiBTZWFyY2ggbG9vcCAqLwogICAgd2hpbGUgKChvZmZzZXQrMik8YnVmTGVuKSAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgZWxlbWVudCBJRCBhbmQgbGVuZ3RoICgyYnl0ZXMpCiAgICB7CiAgICAgICAgLyogU2VhcmNoIHRhcmdldCBlbGVtZW50ICovCiAgICAgICAgaWQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpOwogICAgICAgIGlmIChpZCA9PSBaTV9XTEFOX0VJRF9XSUZJX0lFKQogICAgICAgIHsKICAgICAgICAgICAgLyogQmluZ28gKi8KICAgICAgICAgICAgZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKICAgICAgICAgICAgaWYgKGVsZW4gPiBidWZMZW4gLSBvZmZzZXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgbGVuZ3RoIGVycm9yICovCiAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMCkKICAgICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCszKSkgPT0gMHgwMykKICAgICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs0KSkgPT0gMHg3ZikKICAgICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs1KSkgPT0gdHlwZSkpCgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIHN1YnR5cGUgIT0gMHhmZiApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzYpOwogICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gc3VidHlwZSAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogQWR2YW5jZSB0byBuZXh0IGVsZW1lbnQgKi8KICAgICAgICBlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOwogICAgICAgIGlmIChlbGVuID09IDApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gMHhmZmZmOwogICAgICAgIH0KICAgICAgICBvZmZzZXQgKz0gKGVsZW4rMik7CiAgICB9CiAgICByZXR1cm4gMHhmZmZmOwp9Cgp1MTZfdCB6ZkZpbmRCcmRjbU1ydmxSbG5rRXh0Q2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKewogICAgdThfdCBzdWJUeXBlOwogICAgdTE2X3Qgb2Zmc2V0OwogICAgdTE2X3QgYnVmTGVuOwogICAgdTE2X3QgZWxlbjsKICAgIHU4X3QgaWQ7CiAgICB1OF90IHRtcDsKCiAgICAvKiBHZXQgb2Zmc2V0IG9mIGZpcnN0IGVsZW1lbnQgKi8KICAgIHN1YlR5cGUgPSAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCkgPj4gNCk7CgogICAgb2Zmc2V0ID0gemdFbGVtZW50T2Zmc2V0VGFibGVbc3ViVHlwZV07CiAgICBpZiAob2Zmc2V0ID09IDB4ZmYpCiAgICB7CiAgICAgICAgem1fYXNzZXJ0KDApOwogICAgfQoKICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KICAgIG9mZnNldCArPSAyNDsKCiAgICBidWZMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKCiAgICAvKiBTZWFyY2ggbG9vcCAqLwogICAgd2hpbGUgKChvZmZzZXQrMik8YnVmTGVuKSAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgZWxlbWVudCBJRCBhbmQgbGVuZ3RoICgyYnl0ZXMpCiAgICB7CiAgICAgICAgLyogU2VhcmNoIHRhcmdldCBlbGVtZW50ICovCiAgICAgICAgaWQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpOwogICAgICAgIGlmIChpZCA9PSBaTV9XTEFOX0VJRF9XSUZJX0lFKQogICAgICAgIHsKICAgICAgICAgICAgLyogQmluZ28gKi8KICAgICAgICAgICAgZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKICAgICAgICAgICAgaWYgKGVsZW4gPiBidWZMZW4gLSBvZmZzZXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgbGVuZ3RoIGVycm9yICovCiAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMCkKICAgICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCszKSkgPT0gMHgxMCkKICAgICAgICAgICAgICAgICAgICAmJiAoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCs0KSkgPT0gMHgxOCkpCgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzIpKSA9PSAweDAwKQogICAgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzMpKSA9PSAweDUwKQogICAgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzQpKSA9PSAweDQzKSkKCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoKGlkID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KSkgPT0gMHg3RikKICAgICAgICB7CiAgICAgICAgICAgIC8qIEJpbmdvICovCiAgICAgICAgICAgIGVsZW4gPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMSk7CiAgICAgICAgICAgIGlmIChlbGVuID4gYnVmTGVuIC0gb2Zmc2V0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBFbGVtZW50IGxlbmd0aCBlcnJvciAqLwogICAgICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBlbGVuID09IDAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMik7CiAgICAgICAgICAgIGlmICh0bXAgPT0gMHgwMSkKCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIEFkdmFuY2UgdG8gbmV4dCBlbGVtZW50ICovCiAgICAgICAgZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKICAgICAgICBpZiAoZWxlbiA9PSAwKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKICAgICAgICB9CiAgICAgICAgb2Zmc2V0ICs9IChlbGVuKzIpOwogICAgfQogICAgcmV0dXJuIDB4ZmZmZjsKfQoKdTE2X3QgemZGaW5kTWFydmVsRXh0Q2FwKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1ZikKewogICAgdThfdCBzdWJUeXBlOwogICAgdTE2X3Qgb2Zmc2V0OwogICAgdTE2X3QgYnVmTGVuOwogICAgdTE2X3QgZWxlbjsKICAgIHU4X3QgaWQ7CiAgICB1OF90IHRtcDsKCiAgICAvKiBHZXQgb2Zmc2V0IG9mIGZpcnN0IGVsZW1lbnQgKi8KICAgIHN1YlR5cGUgPSAoem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1ZiwgMCkgPj4gNCk7CgogICAgb2Zmc2V0ID0gemdFbGVtZW50T2Zmc2V0VGFibGVbc3ViVHlwZV07CiAgICBpZiAob2Zmc2V0ID09IDB4ZmYpCiAgICB7CiAgICAgICAgem1fYXNzZXJ0KDApOwogICAgfQoKICAgIC8qIFBsdXMgd2xhbiBoZWFkZXIgKi8KICAgIG9mZnNldCArPSAyNDsKCiAgICBidWZMZW4gPSB6ZndCdWZHZXRTaXplKGRldiwgYnVmKTsKCiAgICAvKiBTZWFyY2ggbG9vcCAqLwogICAgd2hpbGUgKChvZmZzZXQrMik8YnVmTGVuKSAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgZWxlbWVudCBJRCBhbmQgbGVuZ3RoICgyYnl0ZXMpCiAgICB7CiAgICAgICAgLyogU2VhcmNoIHRhcmdldCBlbGVtZW50ICovCiAgICAgICAgaWQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpOwogICAgICAgIGlmIChpZCA9PSBaTV9XTEFOX0VJRF9XSUZJX0lFKQogICAgICAgIHsKICAgICAgICAgICAgLyogQmluZ28gKi8KICAgICAgICAgICAgZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKICAgICAgICAgICAgaWYgKGVsZW4+KGJ1ZkxlbiAtIG9mZnNldCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgbGVuZ3RoIGVycm9yICovCiAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgoKHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKSkgPT0gMHgwMCkKICAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMykpID09IDB4NTApCiAgICAgICAgICAgICAgICAgICYmICgodG1wID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzQpKSA9PSAweDQzKSkKCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIEFkdmFuY2UgdG8gbmV4dCBlbGVtZW50ICovCiAgICAgICAgZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKICAgICAgICBpZiAoZWxlbiA9PSAwKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIDB4ZmZmZjsKICAgICAgICB9CiAgICAgICAgb2Zmc2V0ICs9IChlbGVuKzIpOwogICAgfQogICAgcmV0dXJuIDB4ZmZmZjsKfQoKdTE2X3QgemZGaW5kQnJvYWRjb21FeHRDYXAoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQp7CiAgICB1OF90IHN1YlR5cGU7CiAgICB1MTZfdCBvZmZzZXQ7CiAgICB1MTZfdCBidWZMZW47CiAgICB1MTZfdCBlbGVuOwogICAgdThfdCBpZDsKICAgIHU4X3QgdG1wOwoKICAgIC8qIEdldCBvZmZzZXQgb2YgZmlyc3QgZWxlbWVudCAqLwogICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKCiAgICBvZmZzZXQgPSB6Z0VsZW1lbnRPZmZzZXRUYWJsZVtzdWJUeXBlXTsKICAgIGlmIChvZmZzZXQgPT0gMHhmZikKICAgIHsKICAgICAgICB6bV9hc3NlcnQoMCk7CiAgICB9CgogICAgLyogUGx1cyB3bGFuIGhlYWRlciAqLwogICAgb2Zmc2V0ICs9IDI0OwoKICAgIGJ1ZkxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOwoKICAgIC8qIFNlYXJjaCBsb29wICovCiAgICB3aGlsZSgob2Zmc2V0KzIpIDwgYnVmTGVuKSAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgZWxlbWVudCBJRCBhbmQgbGVuZ3RoICgyYnl0ZXMpCiAgICB7CiAgICAgICAgLyogU2VhcmNoIHRhcmdldCBlbGVtZW50ICovCiAgICAgICAgaWQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpOwogICAgICAgIGlmIChpZCA9PSBaTV9XTEFOX0VJRF9XSUZJX0lFKQogICAgICAgIHsKICAgICAgICAgICAgLyogQmluZ28gKi8KICAgICAgICAgICAgZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKICAgICAgICAgICAgaWYgKGVsZW4gPiAoYnVmTGVuIC0gb2Zmc2V0KSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogRWxlbWVudCBsZW5ndGggZXJyb3IgKi8KICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlbGVuID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMikpID09IDB4MDApCiAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrMykpID09IDB4MTApCiAgICAgICAgICAgICAgICAgJiYgKCh0bXAgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQrNCkpID09IDB4MTgpICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogQWR2YW5jZSB0byBuZXh0IGVsZW1lbnQgKi8KICAgICAgICBlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOwogICAgICAgIGlmIChlbGVuID09IDApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gMHhmZmZmOwogICAgICAgIH0KCiAgICAgICAgb2Zmc2V0ICs9IChlbGVuKzIpOwogICAgfQoKICAgIHJldHVybiAweGZmZmY7Cn0KCnUxNl90IHpmRmluZFJsbmtFeHRDYXAoemRldl90KiBkZXYsIHpidWZfdCogYnVmKQp7CiAgICB1OF90IHN1YlR5cGU7CiAgICB1MTZfdCBvZmZzZXQ7CiAgICB1MTZfdCBidWZMZW47CiAgICB1MTZfdCBlbGVuOwogICAgdThfdCBpZDsKICAgIHU4X3QgdG1wOwoKICAgIC8qIEdldCBvZmZzZXQgb2YgZmlyc3QgZWxlbWVudCAqLwogICAgc3ViVHlwZSA9ICh6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCAwKSA+PiA0KTsKCiAgICBvZmZzZXQgPSB6Z0VsZW1lbnRPZmZzZXRUYWJsZVtzdWJUeXBlXTsKICAgIGlmIChvZmZzZXQgPT0gMHhmZikKICAgIHsKICAgICAgICB6bV9hc3NlcnQoMCk7CiAgICB9CgogICAgLyogUGx1cyB3bGFuIGhlYWRlciAqLwogICAgb2Zmc2V0ICs9IDI0OwoKICAgIGJ1ZkxlbiA9IHpmd0J1ZkdldFNpemUoZGV2LCBidWYpOwoKICAgIC8qIFNlYXJjaCBsb29wICovCiAgICB3aGlsZSgob2Zmc2V0KzIpIDwgYnVmTGVuKSAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgZWxlbWVudCBJRCBhbmQgbGVuZ3RoICgyYnl0ZXMpCiAgICB7CiAgICAgICAgLyogU2VhcmNoIHRhcmdldCBlbGVtZW50ICovCiAgICAgICAgaWQgPSB6bXdfcnhfYnVmX3JlYWRiKGRldiwgYnVmLCBvZmZzZXQpOwogICAgICAgIGlmIChpZCA9PSAweDdGKQogICAgICAgIHsKICAgICAgICAgICAgLyogQmluZ28gKi8KICAgICAgICAgICAgZWxlbiA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsxKTsKICAgICAgICAgICAgaWYgKGVsZW4gPiBidWZMZW4gLSBvZmZzZXQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIEVsZW1lbnQgbGVuZ3RoIGVycm9yICovCiAgICAgICAgICAgICAgICByZXR1cm4gMHhmZmZmOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIGVsZW4gPT0gMCApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAweGZmZmY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRtcCA9IHptd19yeF9idWZfcmVhZGIoZGV2LCBidWYsIG9mZnNldCsyKTsKICAgICAgICAgICAgaWYgKHRtcCA9PSAweDAxKQoKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogQWR2YW5jZSB0byBuZXh0IGVsZW1lbnQgKi8KICAgICAgICBlbGVuID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIGJ1Ziwgb2Zmc2V0KzEpOwogICAgICAgIGlmIChlbGVuID09IDApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gMHhmZmZmOwogICAgICAgIH0KCiAgICAgICAgb2Zmc2V0ICs9IChlbGVuKzIpOwogICAgfQoKICAgIHJldHVybiAweGZmZmY7Cn0K