Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBQaG90b3Nob3AgTG9hZGVyCi8vCi8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQovLwovLyBCYXNlZCBvbiBMR1BMIGNvZGUgY3JlYXRlZCBhbmQgcHVibGlzaGVkIGJ5IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZWx5bngvCi8vCi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCi8vCi8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQovLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUwovLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAovLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQovLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCi8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKLy8gVEhJUyBESVNDTEFJTUVSLgovLwovLyBVc2UgYXQgeW91ciBvd24gcmlzayEKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2lmbmRlZiBQU0RQQVJTRVJfSAojZGVmaW5lIFBTRFBBUlNFUl9ICgovKioKVGFibGUgMi0xMjogRmlsZSBoZWFkZXIgc2VjdGlvbi4gClRoZSBmaWxlIGhlYWRlciBjb250YWlucyB0aGUgYmFzaWMgcHJvcGVydGllcyBvZiB0aGUgaW1hZ2UuIAoqLwp0eXBlZGVmIHN0cnVjdCBwc2RIZWFkZXIgewoJQllURSBTaWduYXR1cmVbNF07CS8vISBBbHdheXMgZXF1YWwgOEJQUywgZG8gbm90IHRyeSB0byByZWFkIHRoZSBmaWxlIGlmIHRoZSBzaWduYXR1cmUgZG9lcyBub3QgbWF0Y2ggdGhpcyB2YWx1ZS4KCUJZVEUgVmVyc2lvblsyXTsJLy8hIEFsd2F5cyBlcXVhbCAxLCBkbyBub3QgcmVhZCBmaWxlIGlmIHRoZSB2ZXJzaW9uIGRvZXMgbm90IG1hdGNoIHRoaXMgdmFsdWUuCgljaGFyIFJlc2VydmVkWzZdOwkvLyEgTXVzdCBiZSB6ZXJvLgoJQllURSBDaGFubmVsc1syXTsJLy8hIE51bWVyIG9mIGNoYW5uZWxzIGluY2x1ZGluZyBhbnkgYWxwaGEgY2hhbm5lbHMsIHN1cHBvcnRlZCByYW5nZSBpcyAxIHRvIDI0LgoJQllURSBSb3dzWzRdOwkJLy8hIFRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGluIHBpeGVscy4gU3VwcG9ydGVkIHJhbmdlIGlzIDEgdG8gMzAsMDAwLgoJQllURSBDb2x1bW5zWzRdOwkvLyEgVGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBpbiBwaXhlbHMuIFN1cHBvcnRlZCByYW5nZSBpcyAxIHRvIDMwLDAwMC4KCUJZVEUgRGVwdGhbMl07CQkvLyEgVGhlIG51bWJlciBvZiBiaXRzIHBlciBjaGFubmVsLiBTdXBwb3J0ZWQgdmFsdWVzIGFyZSAxLCA4LCBhbmQgMTYuCglCWVRFIE1vZGVbMl07CQkvLyEgQ29sb3VyIG1vZGUgb2YgdGhlIGZpbGUsIEJpdG1hcD0wLCBHcmF5c2NhbGU9MSwgSW5kZXhlZD0yLCBSR0I9MywgQ01ZSz00LCBNdWx0aWNoYW5uZWw9NywgRHVvdG9uZT04LCBMYWI9OS4gCn0gcHNkSGVhZGVyOwoKLyoqClRhYmxlIDItMTI6IEhlYWRlckluZm8gQ29sb3Igc3BhY2VzCkBzZWUgcHNkSGVhZGVyCiovCmNsYXNzIHBzZEhlYWRlckluZm8gewpwdWJsaWM6CglzaG9ydCBfQ2hhbm5lbHM7CS8vISBOdW1lciBvZiBjaGFubmVscyBpbmNsdWRpbmcgYW55IGFscGhhIGNoYW5uZWxzLCBzdXBwb3J0ZWQgcmFuZ2UgaXMgMSB0byAyNC4KCWludCAgIF9IZWlnaHQ7CQkvLyEgVGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgaW4gcGl4ZWxzLiBTdXBwb3J0ZWQgcmFuZ2UgaXMgMSB0byAzMCwwMDAuCglpbnQgICBfV2lkdGg7CQkvLyEgVGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBpbiBwaXhlbHMuIFN1cHBvcnRlZCByYW5nZSBpcyAxIHRvIDMwLDAwMC4KCXNob3J0IF9CaXRzUGVyUGl4ZWw7Ly8hIFRoZSBudW1iZXIgb2YgYml0cyBwZXIgY2hhbm5lbC4gU3VwcG9ydGVkIHZhbHVlcyBhcmUgMSwgOCwgYW5kIDE2LgoJc2hvcnQgX0NvbG91ck1vZGU7CS8vISBDb2xvdXIgbW9kZSBvZiB0aGUgZmlsZSwgQml0bWFwPTAsIEdyYXlzY2FsZT0xLCBJbmRleGVkPTIsIFJHQj0zLCBDTVlLPTQsIE11bHRpY2hhbm5lbD03LCBEdW90b25lPTgsIExhYj05LiAKCnB1YmxpYzoKCXBzZEhlYWRlckluZm8oKTsKCX5wc2RIZWFkZXJJbmZvKCk7CgkvKioKCUByZXR1cm4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQKCSovCglib29sIFJlYWQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKTsKfTsKCi8qKgpUYWJsZSAyLTEzIENvbG9yIG1vZGUgZGF0YSBzZWN0aW9uCgpPbmx5IGluZGV4ZWQgY29sb3IgYW5kIGR1b3RvbmUgaGF2ZSBjb2xvciBtb2RlIGRhdGEuIEZvciBhbGwgb3RoZXIgbW9kZXMsCnRoaXMgc2VjdGlvbiBpcyBqdXN0IDQgYnl0ZXM6IHRoZSBsZW5ndGggZmllbGQsIHdoaWNoIGlzIHNldCB0byB6ZXJvLgpGb3IgaW5kZXhlZCBjb2xvciBpbWFnZXMsIHRoZSBsZW5ndGggd2lsbCBiZSBlcXVhbCB0byA3NjgsIGFuZCB0aGUgY29sb3IgZGF0YQp3aWxsIGNvbnRhaW4gdGhlIGNvbG9yIHRhYmxlIGZvciB0aGUgaW1hZ2UsIGluIG5vbpZpbnRlcmxlYXZlZCBvcmRlci4KRm9yIGR1b3RvbmUgaW1hZ2VzLCB0aGUgY29sb3IgZGF0YSB3aWxsIGNvbnRhaW4gdGhlIGR1b3RvbmUgc3BlY2lmaWNhdGlvbiwKdGhlIGZvcm1hdCBvZiB3aGljaCBpcyBub3QgZG9jdW1lbnRlZC4gT3RoZXIgYXBwbGljYXRpb25zIHRoYXQgcmVhZApQaG90b3Nob3AgZmlsZXMgY2FuIHRyZWF0IGEgZHVvdG9uZSBpbWFnZSBhcyBhIGdyYXlzY2FsZSBpbWFnZSwgYW5kIGp1c3QKcHJlc2VydmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBkdW90b25lIGluZm9ybWF0aW9uIHdoZW4gcmVhZGluZyBhbmQgd3JpdGluZwp0aGUgZmlsZS4KKi8KY2xhc3MgcHNkQ29sb3VyTW9kZURhdGEgewpwdWJsaWM6CglpbnQgX0xlbmd0aDsJCQkvLyEgVGhlIGxlbmd0aCBvZiB0aGUgZm9sbG93aW5nIGNvbG9yIGRhdGEKCUJZVEUgKiBfcGxDb2xvdXJEYXRhOwkvLyEgVGhlIGNvbG9yIGRhdGEKCnB1YmxpYzoKCXBzZENvbG91ck1vZGVEYXRhKCk7Cgl+cHNkQ29sb3VyTW9kZURhdGEoKTsKCS8qKgoJQHJldHVybiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZAoJKi8KCWJvb2wgUmVhZChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpOwoJYm9vbCBGaWxsUGFsZXR0ZShGSUJJVE1BUCAqZGliKTsKfTsKCi8qKgpUYWJsZSAyljE6IEltYWdlIHJlc291cmNlIGJsb2NrCk5COiBSZXNvdXJjZSBkYXRhIGlzIHBhZGRlZCB0byBtYWtlIHNpemUgZXZlbgoqLwpjbGFzcyBwc2RJbWFnZVJlc291cmNlIHsKcHVibGljOgoJaW50ICAgICBfTGVuZ3RoOwoJY2hhciAgICBfT1NUeXBlWzRdOwkvLyEgUGhvdG9zaG9wIGFsd2F5cyB1c2VzIGl0cyBzaWduYXR1cmUsIDhCSU0KCXNob3J0ICAgX0lEOwkJLy8hIFVuaXF1ZSBpZGVudGlmaWVyLiBJbWFnZSByZXNvdXJjZSBJRHMgb24gcGFnZSA4CglCWVRFICogX3BsTmFtZTsJCS8vISBBIHBhc2NhbCBzdHJpbmcsIHBhZGRlZCB0byBtYWtlIHNpemUgZXZlbiAoYSBudWxsIG5hbWUgY29uc2lzdHMgb2YgdHdvIGJ5dGVzIG9mIDApCglpbnQgICAgIF9TaXplOwkJLy8hIEFjdHVhbCBzaXplIG9mIHJlc291cmNlIGRhdGEuIFRoaXMgZG9lcyBub3QgaW5jbHVkZSB0aGUgVHlwZSwgSUQsIE5hbWUgb3IgU2l6ZSBmaWVsZHMuCgpwdWJsaWM6Cglwc2RJbWFnZVJlc291cmNlKCk7Cgl+cHNkSW1hZ2VSZXNvdXJjZSgpOwoJdm9pZCBSZXNldCgpOwp9OwoKLyoqClRhYmxlIEEtNjogUmVzb2x1dGlvbkluZm8gc3RydWN0dXJlClRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXNvbHV0aW9uIG9mIGFuIGltYWdlLiBJdCBpcwp3cml0dGVuIGFzIGFuIGltYWdlIHJlc291cmNlLiBTZWUgdGhlIERvY3VtZW50IGZpbGUgZm9ybWF0cyBjaGFwdGVyIGZvciBtb3JlCmRldGFpbHMuCiovCmNsYXNzIHBzZFJlc29sdXRpb25JbmZvIHsKcHVibGljOgoJc2hvcnQgX3dpZHRoVW5pdDsJLy8hIERpc3BsYXkgd2lkdGggYXMgMT1pbmNoZXM7IDI9Y207IDM9cG9pbnRzOyA0PXBpY2FzOyA1PWNvbHVtbnMuCglzaG9ydCBfaGVpZ2h0VW5pdDsJLy8hIERpc3BsYXkgaGVpZ2h0IGFzIDE9aW5jaGVzOyAyPWNtOyAzPXBvaW50czsgND1waWNhczsgNT1jb2x1bW5zLgoJc2hvcnQgX2hSZXM7CQkvLyEgSG9yaXpvbnRhbCByZXNvbHV0aW9uIGluIHBpeGVscyBwZXIgaW5jaC4KCXNob3J0IF92UmVzOwkJLy8hIFZlcnRpY2FsIHJlc29sdXRpb24gaW4gcGl4ZWxzIHBlciBpbmNoLgoJaW50IF9oUmVzVW5pdDsJCS8vISAxPWRpc3BsYXkgaG9yaXpvbnRhbCByZXNvbHV0aW9uIGluIHBpeGVscyBwZXIgaW5jaDsgMj1kaXNwbGF5IGhvcml6b250YWwgcmVzb2x1dGlvbiBpbiBwaXhlbHMgcGVyIGNtLgoJaW50IF92UmVzVW5pdDsJCS8vISAxPWRpc3BsYXkgdmVydGljYWwgcmVzb2x1dGlvbiBpbiBwaXhlbHMgcGVyIGluY2g7IDI9ZGlzcGxheSB2ZXJ0aWNhbCByZXNvbHV0aW9uIGluIHBpeGVscyBwZXIgY20uCgpwdWJsaWM6Cglwc2RSZXNvbHV0aW9uSW5mbygpOwoJfnBzZFJlc29sdXRpb25JbmZvKCk7CQoJLyoqCglAcmV0dXJuIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkCgkqLwoJaW50IFJlYWQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKTsKCS8qKgoJQHBhcmFtIHJlc194IFtvdXRdIFggcmVzb2x1dGlvbiBpbiBwaXhlbHMvbWV0ZXIKCUBwYXJhbSByZXNfeSBbb3V0XSBZIHJlc29sdXRpb24gaW4gcGl4ZWxzL21ldGVyCgkqLwoJdm9pZCBHZXRSZXNvbHV0aW9uSW5mbyh1bnNpZ25lZCAmcmVzX3gsIHVuc2lnbmVkICZyZXNfeSk7Cn07CgovLyBPYnNvbGV0ZSAtIFBob3Rvc2hvcCAyLjAKY2xhc3MgcHNkUmVzb2x1dGlvbkluZm9fdjIgewpwdWJsaWM6CglzaG9ydCBfQ2hhbm5lbHM7CglzaG9ydCBfUm93czsKCXNob3J0IF9Db2x1bW5zOwoJc2hvcnQgX0RlcHRoOwoJc2hvcnQgX01vZGU7CgkKcHVibGljOgoJcHNkUmVzb2x1dGlvbkluZm9fdjIoKTsKCX5wc2RSZXNvbHV0aW9uSW5mb192MigpOwoJLyoqCglAcmV0dXJuIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkCgkqLwoJaW50IFJlYWQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKTsKfTsKCi8qKgpUYWJsZSBBLTc6IERpc3BsYXlJbmZvIENvbG9yIHNwYWNlcwpUaGlzIHN0cnVjdHVyZSBjb250YWlucyBkaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGVhY2ggY2hhbm5lbC4gSXQgaXMgd3JpdHRlbiBhcyBhbiBpbWFnZSByZXNvdXJjZS4KKi8KY2xhc3MgcHNkRGlzcGxheUluZm8gewpwdWJsaWM6CglzaG9ydCBfQ29sb3VyU3BhY2U7CglzaG9ydCBfQ29sb3VyWzRdOwoJc2hvcnQgX09wYWNpdHk7ICAvLyEgMC4uMTAwCglCWVRFIF9LaW5kOyAgICAgLy8hIHNlbGVjdGVkID0gMCwgcHJvdGVjdGVkID0gMQoJQllURSBfcGFkZGluZzsgIC8vISBzaG91bGQgYmUgemVybwoJCnB1YmxpYzoKCXBzZERpc3BsYXlJbmZvKCk7Cgl+cHNkRGlzcGxheUluZm8oKTsKCS8qKgoJQHJldHVybiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZAoJKi8KCWludCBSZWFkKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSk7Cn07CgovKioKVGFibGUgMpY1OiBUaHVtYm5haWwgcmVzb3VyY2UgaGVhZGVyCkFkb2JlIFBob3Rvc2hvcCA1LjAgYW5kIGxhdGVyIHN0b3JlcyB0aHVtYm5haWwgaW5mb3JtYXRpb24gZm9yIHByZXZpZXcKZGlzcGxheSBpbiBhbiBpbWFnZSByZXNvdXJjZSBibG9jay4gVGhlc2UgcmVzb3VyY2UgYmxvY2tzIGNvbnNpc3Qgb2YgYW4gaW5pdGlhbAoyOCBieXRlIGhlYWRlciwgZm9sbG93ZWQgYnkgYSBKRklGIHRodW1ibmFpbCBpbiBSR0IgKHJlZCwgZ3JlZW4sIGJsdWUpIG9yZGVyCmZvciBib3RoIE1hY2ludG9zaCBhbmQgV2luZG93cy4gQWRvYmUgUGhvdG9zaG9wIDQuMCBzdG9yZWQgdGhlCnRodW1ibmFpbCBpbmZvcm1hdGlvbiBpbiB0aGUgc2FtZSBmb3JtYXQgZXhjZXB0IHRoZSBkYXRhIHNlY3Rpb24gaXMgQkdSCihibHVlLCBncmVlbiwgcmVkKS4gVGhlIEFkb2JlIFBob3Rvc2hvcCA0LjAgZm9ybWF0IGlzIGF0IHJlc291cmNlIElEIDEwMzMKYW5kIHRoZSBBZG9iZSBQaG90b3Nob3AgNS4wIGZvcm1hdCBpcyBhdCByZXNvdXJjZSBJRCAxMDM2LgoqLwpjbGFzcyBwc2RUaHVtYm5haWwgewpwdWJsaWM6CglpbnQgX0Zvcm1hdDsJCQkvLyEgPSAxIChrSnBlZ1JHQikuIEFsc28gc3VwcG9ydHMga1Jhd1JHQiAoMCkuCglpbnQgX1dpZHRoOwkJCQkvLyEgV2lkdGggb2YgdGh1bWJuYWlsIGluIHBpeGVscy4KCWludCBfSGVpZ2h0OwkJCS8vISBIZWlnaHQgb2YgdGh1bWJuYWlsIGluIHBpeGVscy4KCWludCBfV2lkdGhCeXRlczsJCS8vISBQYWRkZWQgcm93IGJ5dGVzIGFzICh3aWR0aCAqIGJpdHNwaXhlbCArIDMxKSAvIDMyICogNC4KCWludCBfU2l6ZTsJCQkJLy8hIFRvdGFsIHNpemUgYXMgd2lkdGhieXRlcyAqIGhlaWdodCAqIHBsYW5lcwoJaW50IF9Db21wcmVzc2VkU2l6ZTsJLy8hIFNpemUgYWZ0ZXIgY29tcHJlc3Npb24uIFVzZWQgZm9yIGNvbnNpc3RlbnRjeSBjaGVjay4gCglzaG9ydCBfQml0UGVyUGl4ZWw7CQkvLyEgPSAyNC4gQml0cyBwZXIgcGl4ZWwuCglzaG9ydCBfUGxhbmVzOwkJCS8vISA9IDEuIE51bWJlciBvZiBwbGFuZXMuCglCWVRFICogX3BsRGF0YTsJCQkvLyEgSkZJRiBkYXRhIGluIFJHQiBmb3JtYXQuIE5vdGU6IEZvciByZXNvdXJjZSBJRCAxMDMzIHRoZSBkYXRhIGlzIGluIEJHUiBmb3JtYXQuCgkKcHVibGljOgoJcHNkVGh1bWJuYWlsKCk7Cgl+cHNkVGh1bWJuYWlsKCk7CgkvKioKCUByZXR1cm4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQKCSovCglpbnQgUmVhZChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBpVG90YWxEYXRhLCBib29sIGlzQkdSKTsKfTsKCmNsYXNzIHBzZElDQ1Byb2ZpbGUgewpwdWJsaWM6CglpbnQgX1Byb2ZpbGVTaXplOwoJQllURSAqIF9Qcm9maWxlRGF0YTsKcHVibGljOgoJcHNkSUNDUHJvZmlsZSgpOwoJfnBzZElDQ1Byb2ZpbGUoKTsKCS8qKgoJQHJldHVybiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZAoJKi8KCWludCBSZWFkKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHNpemUpOwp9OwoKLyoqClBTRCBsb2FkZXIKKi8KY2xhc3MgcHNkUGFyc2VyIHsKcHJpdmF0ZToKCXBzZEhlYWRlckluZm8JCQlfaGVhZGVySW5mbzsKCXBzZENvbG91ck1vZGVEYXRhCQlfY29sb3VyTW9kZURhdGE7Cglwc2RSZXNvbHV0aW9uSW5mbwkJX3Jlc29sdXRpb25JbmZvOwoJcHNkUmVzb2x1dGlvbkluZm9fdjIJX3Jlc29sdXRpb25JbmZvX3YyOwoJcHNkRGlzcGxheUluZm8JCQlfZGlzcGxheUluZm87Cglwc2RUaHVtYm5haWwJCQlfdGh1bWJuYWlsOwoJcHNkSUNDUHJvZmlsZQkJCV9pY2NQcm9maWxlOwoKCXNob3J0IF9Db2xvdXJDb3VudDsKCXNob3J0IF9UcmFuc3BhcmVudEluZGV4OwoJaW50IF9HbG9iYWxBbmdsZTsKCWJvb2wgX2JSZXNvbHV0aW9uSW5mb0ZpbGxlZDsKCWJvb2wgX2JSZXNvbHV0aW9uSW5mb0ZpbGxlZF92MjsKCWJvb2wgX2JEaXNwbGF5SW5mb0ZpbGxlZDsKCWJvb2wgX2JUaHVtYm5haWxGaWxsZWQ7Cglib29sIF9iQ29weXJpZ2h0OwoKcHJpdmF0ZToKCWJvb2wgUmVhZEltYWdlUmVzb3VyY2UoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKTsKCS8qKglBY3R1YWxseSBpZ25vcmUgaXQgKi8KCWJvb2wgUmVhZExheWVyQW5kTWFza0luZm9TZWN0aW9uKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSk7CglGSUJJVE1BUCogUmVhZEltYWdlRGF0YShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpOwoJRklCSVRNQVAqIFByb2Nlc3NCdWZmZXIoQllURSAqIGlwckRhdGEpOwoKcHVibGljOgoJcHNkUGFyc2VyKCk7Cgl+cHNkUGFyc2VyKCk7CglGSUJJVE1BUCogTG9hZChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBzX2Zvcm1hdF9pZCk7Cgp9OwoKI2VuZGlmIC8vIFBTRFBBUlNFUl9ICgo=